Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> всё то же обьединение чисел, только наоборот, числа сложил, теперь обратно=) 
:(
    Опции темы
relok
Дата 16.11.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
bsa
Дата 16.11.2010, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 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;
PM   Вверх
relok
Дата 16.11.2010, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
mes
Дата 16.11.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(relok @  16.11.2010,  17:53 Найти цитируемый пост)
его нужно разделить на 3 числа, каждое от 0 до 255, 

тогда и объединяйте так :
Код

((x1 * 256) + x2 )*256+x3

или в битовых операциях то же самое
Код

((x1<<8 ) | x2)<<8) | x3

где xn - 8битовая char, 

но раз не сталкивались замените привычными действиями т.е. 1 вариант. 
обратно получать с помощью операции деления и взятия остатка ( / , %)..

Добавлено через 1 минуту и 36 секунд
если 256 не устраивает возьмите 1000, главное чтоб разрядность сохранить и места в переменной_результата хватило.. 


--------------------
PM MAIL WWW   Вверх
relok
Дата 16.11.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
mes
Дата 16.11.2010, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(relok @  16.11.2010,  18:55 Найти цитируемый пост)
понял. нужно если числа 2 2 2 к примеру, то объединять не в 222, а в 
00000010 00000010 00000010 

 smile 



--------------------
PM MAIL WWW   Вверх
relok
Дата 16.11.2010, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.11.2010

Репутация: нет
Всего: нет



smile 
вы же мне то же самое только красивое кинули

а есть формула типа ((x1 * 256) + x2 )*256+x3
только наоборот?

от полученного таким образом числа перейти к x1 x2 x3?

Это сообщение отредактировал(а) relok - 16.11.2010, 20:44
PM MAIL   Вверх
mes
Дата 16.11.2010, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(relok @  16.11.2010,  19:41 Найти цитируемый пост)
от полученного таким образом числа перейти к x1 x2 x3?


Цитата(mes @  16.11.2010,  18:33 Найти цитируемый пост)
обратно получать с помощью операции деления и взятия остатка ( / , %)..

х2 = res /256 % 256;
для остальных сами.. 



--------------------
PM MAIL WWW   Вверх
relok
Дата 16.11.2010, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.11.2010

Репутация: нет
Всего: нет



спасибо вам=)
а что можно почитать на эту тему? про числа, модули и тп
для меня это всё какие то чудесным образом работающие формулы


Это сообщение отредактировал(а) relok - 16.11.2010, 21:00
PM MAIL   Вверх
mes
Дата 16.11.2010, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(relok @  16.11.2010,  19:54 Найти цитируемый пост)
а что можно почитать на эту тему? про числа, модули и тп

про умножение, деление, и остаток - учебник по математики за 3й-4й класс  smile 

Это сообщение отредактировал(а) mes - 16.11.2010, 21:09


--------------------
PM MAIL WWW   Вверх
relok
Дата 16.11.2010, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.11.2010

Репутация: нет
Всего: нет



=)
у меня была задача - три числа нужно закодировать числом одним и декодировать, не потеряв о них информацию

понял как решить - эти 3 байта объединить в одно инт число путём составления из них последовательности битов (если 2, 2 и 2, то 00000010 00000010 00000010 )
эту последовательности перевести в десятичное число и его кодировать

я бы всё это делал тупо - нахожу 24 бита, высчитываю бездумно 0*1 + 1*2 + 0*4 + 0*8 и т.п.

а вы сразу такую формулу красивую дали=)
я тоже так хочу научиться
PM MAIL   Вверх
mes
Дата 16.11.2010, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(relok @  16.11.2010,  20:13 Найти цитируемый пост)
а вы сразу такую формулу красивую дали=)

 ну если это красивое.. то остальное в программирование просто шедевры smile
добро пожаловать в мир информатики 
 smile 




Это сообщение отредактировал(а) mes - 16.11.2010, 21:29


--------------------
PM MAIL WWW   Вверх
bsa
Дата 17.11.2010, 00:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 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 с конца, а деление убирает одну цифру. Почитай более полное описание и пользуйся на здоровье.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.