RSA

Gorjie
1/13/2007, 9:14:36 PM
Написал программку, шифрующую методом RSA для 2048-разрядных чисел... Теперь интересно, каким образом считывать из файла адекватные блоки. Хотя в принципе ерунда, можно через массив...

Возникает другой вопрос, каким образом, записав этот ужас в файл, считать его обратно теми же блоками для расшифровки?
DELETED
1/13/2007, 10:16:54 PM
Реализовали RSA и не знаете, как "считать блок из файла"? Странно это все. И, если не сложно, расскажите общественности, что такое "адекватный блок". Очень интересно.
Gorjie
1/14/2007, 6:18:26 PM
Адекватный - я имел ввиду блок оптимального размера, который должен быть ненамного меньше, чем N. Хотя можно шифровать и байтовые блоки 2048 разрядными числами. Если повезет, размер шифрованного файла может быть аж в 256 раз больше начального...

Вчера почти реализовал следующим образом - считывается из файла побайтово и забивается в строку до нужной длины. Большие числа у меня реализованы как строки. Далее блок шифруется, дополняется спереди нулями, если его длина меньше оптимальной и записывается в файл побайтово, считая за 1 байт 2 цифры из строки.
Также блоком считывается для дешифрации, потом дешифруется и побайтово забивается в файл.

Шифрует неверно, разбираюсь в чем дело. Вопрос такой - даны 2 блока типа байт, равных 1 и 2. Если мы хотим считать их одним блоком типа Word, он будет равен 12 или 001002?
DELETED
1/14/2007, 9:59:14 PM
>блок оптимального размера
"Оптимальный" математически - это однозначное и точное значение. Тем более для шифрования. Оптимальное для программиста - это или точное математическое, или аппроксимация, или иным образом выведенное статистистическое значение. Слова "повезет" для программиста не существует.

>считая за 1 байт 2 цифры из строки
Как можно 2,4,8,16 байт записать в 1? И вообще, забудьте понятие "строка", для этого есть понятие "размер блока". :)

>даны 2 блока типа байт, равных 1 и 2
В смысле?

>12 или 001002?
Я фигею. Во-первых он будет равен sizeof(WORD), во-вторых (насколько мне известно) WORD - это не тип, а виртуальный чисто виндовый #define, а в-третьих, "12 или 001002" - это в какой системе? Хехе.


Не обижайтесь. Конкретизируйте, что Вы хотите, что хотите получить на выходе и какими средствами (и на каком языке) Вы пытаетесь все это реализовать. И все. А дальше будет легче.
Gorjie
1/14/2007, 10:54:21 PM
Да ладно... Пара бессонных ночей сказывается, начинаю путаться.
В данном случае - размер шифруемого блока 255 байт. Конкретизирую - оптимальных с точки зрения быстродействия и минимизации размеров выходного файла. Реализуется вся эта прелесть на Паскале. Как можно 2,4,8,16 байт записать в 1? И вообще, забудьте понятие "строка", для этого есть понятие "размер блока". :) Возможно вы невнимательно читали мой пост, где говорилось, что большие числа представлены как строки (тип String), из десятичных символов разумеется. При чтении необходимо получить большое число, представленное как строка, следовательно записываем в строку десятичные значения считываемых блоков по 8 бит до достижения нужной длинны. Потом шифруем и полученную на выходе строку-число считываем по 2 символа, преобразуем в число типа byte и записываем в файл. Дешифрация проходит в обратном порядке.

Иногда для получения ответа достаточно грамотно сформулировать вопрос, это как раз такой случай. Имелись ввиду паскалевские типы данных, то есть десятичное представление двоичного значения блока, имеющего длину согласно используемому типу данных. При представлении их в двоичном виде ответ становится понятен.

При определении типа блоков соответственно определяется длина считываемой из файла двоичной последовательности за одну итерацию процедуры чтения. То есть, если f определяется, как file of byte, то при чтении считывается блок длиной 8 бит, а если File of word - то 16 бит. Под блоком типа байт понимался байтовый блок, под ворд - блок из 2-х байтов, под его значением - десятичное представление, результат процедуры read.

Грамотная формулировка - чему будет равно десятичное представление представление 16-битового файла, если при считывании его двумя 8-битными блоками, десятичное представление двоичного значения первого равно 1, а второго - 2.
Тогда напрашивающийся самим собой грамотный ответ - если превый блок равен 1, т.е. 00000001, а второй - 2, т.е 00000010, шестнадцатибитовый блок будет равен 0000000100000010, что значит 258, т. е. 1*2^8 + 2, в десятичном представлении.

К сожалению в самой задаче мне это помогло не сильно, бо глюк как оказалось не из-за считывания... Разбираюсь.