我制作了以下文件:asn_format_mykey.txt
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
我运行以下命令来获取key.pem
(私钥)和pkey.pem
(公钥)
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"
然后,我尝试-raw
使用openssl rsautl
echo 'aaaa'| openssl rsautl -encrypt -pubin -inkey "pkey.pem" -raw -out "message.encrypted"
并返回:
RSA operation error 140063665198744:error:0406B07A:rsa
routines:RSA_padding_add_none:data too small for key
size:rsa_none.c:74:
知道如何修复这个问题吗?
答案1
您的模数对于 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"
注意:作为练习这一切都是可以的,但是,对于任何实际工作,您不应该发明自己的填充方案 - 使用现有方案之一。