![]() |
|
Модераторы: bsa |
![]()
|
|
| relok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 13.11.2010 Репутация: нет Всего: нет |
есть 3 числа (0...255)
98 113 104 (int) к примеру я их объединил в 98113104 (int одно такое большое) зашифровал в RSA, записал в файл, прочитал, декодировал, получил 98113104 теперь соответственно нужно их обратно в 98 113 и 104 превратить) всё просто - читаю первые три, если полученное число больше 255, то первые два и будут составлять 98 (первый символ)..смещаю указатель на 2 (или 3 числа) и так далее..113..104 есть ли такая комбинация из 3 чисел (0...255 каждое) , что произойдет ошибка при таком разбиении? или есть другой способ это сделать? Это сообщение отредактировал(а) relok - 16.11.2010, 17:48 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
relok, есть. и намного более простой.
На сколько я знаю, RSA работает с блоками данных, размером равным ключу шифрования. Обычно, это что-то типа 1024 - 128 байт. Это значит, что шифровать нужно блок размером 128 байт. Выделяешь память на 128 char, в первые элементы пишешь кодируемые данные, для остального делаешь дополнение (в описании сказано как). шифруешь... расшифровываешь, берешь 3 первых байта. Если тебе нужно шифровать 24-х или 32-х битное слово, то тогда не морочься так, как ты это делал. А воспользуйся родными для компьютера типами и преобразованиями: uint32_t word = ((uint32_t)num3 << 16) | ((uint32_t)num2 << 8) | num1; |
|||
|
||||
| relok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 13.11.2010 Репутация: нет Всего: нет |
не понял о чем вы
есть число 98113104 его нужно разделить на 3 числа, каждое от 0 до 255, т.е. на 98 , 113 и 104 блоки - по 3 байта, т.к. для лабы нету смысла брать большой модуль а про uint32_t word = ((uint32_t)num3 << 16) | ((uint32_t)num2 << 8) | num1; первый раз слышу=) Это сообщение отредактировал(а) relok - 16.11.2010, 19:06 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
тогда и объединяйте так :
или в битовых операциях то же самое
где xn - 8битовая char, но раз не сталкивались замените привычными действиями т.е. 1 вариант. обратно получать с помощью операции деления и взятия остатка ( / , %).. Добавлено через 1 минуту и 36 секунд если 256 не устраивает возьмите 1000, главное чтоб разрядность сохранить и места в переменной_результата хватило.. |
||||
|
|||||
| relok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 13.11.2010 Репутация: нет Всего: нет |
попробую разбираться в том, что вы написали
так как то что я задумал, неосуществимо если соединить к примеру 13 , 13 и 13, то получится 131313 если соединить 131 , 31 и 3, то получится тоже самое 131313 то есть декодировать будет невозможно блин понял. нужно если числа 2 2 2 к примеру, то объединять не в 222, а в 00000010 00000010 00000010 = 131586 Это сообщение отредактировал(а) relok - 16.11.2010, 20:14 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| relok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 13.11.2010 Репутация: нет Всего: нет |
вы же мне то же самое только красивое кинули а есть формула типа ((x1 * 256) + x2 )*256+x3 только наоборот? от полученного таким образом числа перейти к x1 x2 x3? Это сообщение отредактировал(а) relok - 16.11.2010, 20:44 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| relok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 13.11.2010 Репутация: нет Всего: нет |
спасибо вам=)
а что можно почитать на эту тему? про числа, модули и тп для меня это всё какие то чудесным образом работающие формулы Это сообщение отредактировал(а) relok - 16.11.2010, 21:00 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
про умножение, деление, и остаток - учебник по математики за 3й-4й класс Это сообщение отредактировал(а) mes - 16.11.2010, 21:09 |
|||
|
||||
| relok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 13.11.2010 Репутация: нет Всего: нет |
=)
у меня была задача - три числа нужно закодировать числом одним и декодировать, не потеряв о них информацию понял как решить - эти 3 байта объединить в одно инт число путём составления из них последовательности битов (если 2, 2 и 2, то 00000010 00000010 00000010 ) эту последовательности перевести в десятичное число и его кодировать я бы всё это делал тупо - нахожу 24 бита, высчитываю бездумно 0*1 + 1*2 + 0*4 + 0*8 и т.п. а вы сразу такую формулу красивую дали=) я тоже так хочу научиться |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну если это красивое.. то остальное в программирование просто шедевры добро пожаловать в мир информатики Это сообщение отредактировал(а) mes - 16.11.2010, 21:29 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
relok, в байте хранится число от 0 до 255. Итого 256 значений. В слове (16 бит - 2 байта) хранится уже 65536 значений (256 * 256). Это тебе особо ничего не говорит... Именно для этого придумана была 16-тиричная система. 256 == 0x100, 65536 = 0x10000... Тебе это ничего не напоминает? Таким образом, чтобы запихать 3 байта в одно 32-х разрядное число достаточно: x = a0 + a1 * 0x100 + a2 * 0x10000.
В компьютерной технике все так же, как и в жизни. Но у компьютера не 10 пальцев, поэтому считать он может только до 1. Для удобства людей были придуманы 8-ме и 16-теричные системы, которые объединяют в одной цифре 3 или 4 бита соответственно. Восьмеричная нужна редко, а вот 16-теричная часто. Математика такая же, как и в десятеричной - умножение на 0x10 добавляет к числу 0 с конца, а деление убирает одну цифру. Почитай более полное описание и пользуйся на здоровье. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |