使用带有自定义 rsa 密钥的 openssl 进行加密

111*_*111 2 openssl

我制作了以下文件: 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 
Run Code Online (Sandbox Code Playgroud)

我运行以下命令来获取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"
Run Code Online (Sandbox Code Playgroud)

然后,我尝试使用-rawwith加密一条小消息openssl rsautl

echo 'aaaa'| openssl rsautl -encrypt -pubin -inkey "pkey.pem" -raw -out "message.encrypted"
Run Code Online (Sandbox Code Playgroud)

它返回:

RSA operation error 140063665198744:error:0406B07A:rsa
routines:RSA_padding_add_none:data too small for key
size:rsa_none.c:74:
Run Code Online (Sandbox Code Playgroud)

知道如何解决这个问题吗?

小智 5

对于 RSA,您的模数异常小且不安全,但我想您知道这一点!

十进制的模数是305512047893009,十六进制的模数是0115DC91160DA11,这是一个正好是 7 个字节长的数字。

您已通过该-raw标志,这意味着您没有使用任何标准填充方案,这意味着您有责任确保输入消息的格式正确以进行 RSA 加密。实际上,这意味着您的输入消息也必须正好是 7 个字节长且值小于模数,因此您需要创建一个二进制文件并将其用作输入。

使用十六进制编辑器,我用 bytes 创建了一个,将其01146161616161保存在一个名为 的文件中message.plain,然后我使用了与您相同的命令,但-in message.plain添加了,它成功地加密了消息:

openssl rsautl -encrypt -pubin -inkey "pkey.pem" -raw -in "message.plain" -out "message.encrypted"
Run Code Online (Sandbox Code Playgroud)

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