Зашифруйте строку букв с помощью RSA, используя C = M^e mod n

#cryptography #rsa

Вопрос:

Привет 🙂 Я погуглил, чтобы понять смысл этого вопроса: Зашифруйте слово «БЕЗОПАСНОСТЬ» с параметрами p = 13, q = 19, e = 5. Каков соответствующий зашифрованный текст в шестнадцатеричной форме?

Я использовал шифр = M^e mod (pq) для каждой буквы, соответствующей значению ASCII. Поэтому для S я написал: 85^5 mod 247 = 239. Затем я перешел к преобразованию 239 в шестнадцатеричную форму: «EF».

Это правильный способ сделать это? Делая это буква за буквой, а затем, в конце концов, просто сложите все шестнадцатеричные числа вместе, чтобы получить строку «EFB388CE3E639121»?

Или мне следует сложить шифр из каждой буквы вместе, а затем преобразовать его в шестнадцатеричную форму?

 C(S) = 239, C(E) = 179, C(C) = 136 C(U) = 206 
C(R) = 62,  C(I) = 99,  C(T) = 145, C(Y) = 33



Add them together: 239 179 136 .. = 1099.
Convert 1099 to hexadecimal = 44B. 
 

На мой взгляд, кажется бессмысленным складывать их вместе, так как несколько букв могут составить общее значение 1099, и это затруднило бы расшифровку, но я просто хочу быть уверенным 🙂

Ответ №1:

Да, вы действительно можете зашифровать с помощью RSA таким образом, отметив, однако, что полученный зашифрованный текст поддается обработке (что можно исправить, подписав цифровой подписью открытый текст или зашифрованное текстовое сообщение). Это похоже на выполнение, например, AES в режиме ECB. Обычно шифрование RSA — как указано в стандартах PKCS#1 — рандомизировано, но ваше-нет, поэтому сохраняются те же проблемы режима ECB: одинаковые буквы будут зашифрованы с одинаковым значением, что сделает его небезопасным и уязвимым для частотного анализа. Это, конечно, помимо очевидной проблемы с размером ключа RSA; RSAдля обеспечения безопасности требуется специальное заполнение входного сообщения.

Однако обратите внимание, что вам захочется различать зашифрованный текст букв. Это означает, что вы всегда должны использовать одно и то же количество байтов / шестнадцатеричных знаков для кодирования числа, представляющего зашифрованный текст. Это означает, что начальные нули должны быть сохранены. Это, опять же, также происходит в стандарте PKCS#1 (поиск I2OSP, который преобразует целое число в байты).

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

Ответ №2:

RSA предполагает , что все ваше сообщение представляет собой одно целое M число, тогда, как вы и говорите:

 C = M^e mod N
M = C^d mod N
 

где N = pq . Это предполагает, что M < N .

Если вы закодируете свое сообщение SECURITY как шестнадцатеричное и обработаете эту шестнадцатеричную строку как число, вы получите:

 'SECURITY' -> 5345435552495459 -> 6000276112272872537
 

К сожалению, это число слишком велико, чтобы его можно было зашифровать N=247 .
Я имею в виду, конечно, вы можете «зашифровать» его, передав через формулу, но вы не сможете восстановить исходное сообщение.

Автор задания может означать, что вы шифруете каждую букву по отдельности, а затем объединяете шестнадцатеричный вывод (как и вы), но это действительно странное использование RSA, что делает задание очень вводящим в заблуждение.

Ответ №3:

Сначала вы должны преобразовать каждую букву в форму ASCII, что означает:

M(S) = 83, M(E) = 69, M(C) = 67, M(U) = 85, M(R) = 82, M(I) = 73, M(T) = 84, M(Y) = 89.

А затем вы можете соединить отдельные номера вместе, чтобы получить сообщение:

M = 8369678582738489.

ЗАТЕМ вы можете найти свой зашифрованный текст, прежде чем сможете найти соответствующее число в шестнадцатеричной форме.