我正在尝试使用openssl提出一个单线解决方案,它将接收消息的填充SHA256摘要(在这种情况下为256字节,对于RSA2048),并将RSA“解密”应用于256字节摘要,即
m^d mod n
其中 n 是模数,d 是私有指数,m 是摘要消息(填充)。这在正常的 RSA2048 身份验证中通常会发生,但我需要逐步完成。
我试过了,但没有用。
openssl rsautl -decrypt -in msg.sha256 -inkey secret.pem -out msg.sha256.sig
RSA operation error
2675740:error:04065084:rsa routines:RSA_EAY_PRIVATE_DECRYPT:data too large for
modulus:rsa_eay.c:532:
希望我混淆加密和解密(因为我想在计算中使用私有指数)我也试过这个
openssl rsautl -encrypt -in msg.sha256 -inkey secret.pem -out msg.sha256.sig
RSA operation error
2675740:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large
for key size:rsa_pk1.c:151:
阅读 RSA“加密/解密”,在这种情况下,我认为我将文件加密/解密与单消息加密/解密混淆了。文件加密显然是涉及 AES128 和所有这些的更高级别的协议。我不希望那样,我只想用私有指数进行模幂运算。
我也尝试过pkeyutil
(我知道这是具有相同结果的首选方法)。我很确定我走错了路,也许这在命令行中是不可能的(我知道使用“bignum”从 C API 中是可行的。)
- - 更新 - -
我尝试从 SHA256 散列中删除 PKCS1 v1.5 填充(所以我只剩下 32 个字节的散列),并通过它,但这也不起作用。
$ head -32c msg.sha256 | openssl.exe rsautl -decrypt -inkey secret.pem -out test.sig
RSA operation error
2675740:error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is
not 02:rsa_pk1.c:190:
2675740:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed
:rsa_eay.c:616:
我尝试了同样的-raw
方法,它没有错误地完成,但结果不是我所期望的(这是我所期望的,因为它没有 PKCS1v1.5 填充)。然后我尝试颠倒输入文件的字节顺序,因为 openssl 似乎在抱怨输入文件(作为 256 字节 BIGNUM)略大于模数(作为 256 字节 BIGNUM)的事实,如果你颠倒字节顺序,然后尾随 0 变为前导零,并且更小。它完成了,但结果仍然不正确。
$ perl -e '$a = `cat msg.sha256`; print "".reverse($a);' > msg.sha256r
$ head -256c msg.sha256r | openssl.exe rsautl -encrypt -raw -inkey secret.pem -out test3e.sig
$ head -256c msg.sha256r | openssl.exe rsautl -decrypt -raw -inkey secret.pem -out test3d.sig
是的,我意识到我只是在黑暗中蹒跚而行,但你会惊讶于我有多少次这样幸运......
test3e.sig 和 test3d.sig 都不同意我通过 3rd 方工具进行的计算。