使用 openssl 和自定义 rsa 密钥进行加密

使用 openssl 和自定义 rsa 密钥进行加密

我制作了以下文件: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"

注意:作为练习这一切都是可以的,但是,对于任何实际工作,您不应该发明自己的填充方案 - 使用现有方案之一。

相关内容