Я сделал следующий файл

asn1=SEQUENCE:rsa_key

[rsa_key]
version=INTEGER:0
modulus=INTEGER:305512047893009
pubExp=INTEGER:78221649299689
privExp=INTEGER:181909
p=INTEGER:17477423
q=INTEGER:17480383
e1=INTEGER:181909
e2=INTEGER:181909
coeff=INTEGER:1611938 

это файл asn_format_mykey.txt

Затем я запускаю команды

$openssl asn1parse -genconf asn_format_mykey.txt -out key.der
$openssl rsa -inform der -in key.der -outform pem > key.pem
$openssl rsa -inform der -in key.der -outform pem -pubout>pkey.pem

Итак, мы получили key.pem (закрытый ключ) и pkey.pem (открытый ключ)

Затем я пытаюсь зашифровать небольшое сообщение, используя опцию -raw с openssl rsautl.

$ echo 'aaaa'| openssl rsautl -encrypt -pubin -inkey pkey.pem -raw -out message.encrypted

и я получил

Ошибка операции RSA 140063665198744: ошибка: 0406B07A: подпрограммы rsa: RSA_padding_add_none: данные слишком малы для размера ключа: rsa_none.c: 74:

Есть идеи, как это исправить?

1 ответ1

2

Ваш модуль необычно мал и небезопасен для RSA. Но я думаю, вы это знаете!

Модуль в десятичном виде - 305512047893009. В шестнадцатеричном виде это 0115DC91160DA11.

Это число длиной ровно 7 байтов. Вы прошли флаг "-raw", что означает, что вы не используете стандартную схему заполнения. Это означает, что вы несете ответственность за правильность форматирования входного сообщения для шифрования RSA. На практике это означает, что ваше входное сообщение также должно быть ровно на 7 байтов длиннее и меньше по значению, чем модуль. Вам нужно будет создать двоичный файл и использовать его в качестве входных данных.

Используя шестнадцатеричный редактор, я создал один с байтами: 01146161616161 и сохранил его в файле «message.plain», а затем использовал ту же команду, что и вы, но с добавленным «-in message.plain»:

$ openssl rsautl -encrypt -pubin -inkey pkey.pem -raw -in message.plain -out message.encrypted

Это успешно зашифровало сообщение.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .