我正在尝试使用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都与第三方工具的计算不一致。
答案 0 :(得分:2)
您收到的错误data too large for modulus
是因为您输入了以下代码的第二个if
:
/* make data into a big number */
if (BN_bin2bn(from,(int)flen,f) == NULL) goto err;
if (BN_ucmp(f, rsa->n) >= 0)
{
RSAerr(RSA_F_RSA_EAY_PRIVATE_DECRYPT,RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
goto err;
}
BN_bin2bn
将您的数据from
(无符号字符*)转换为bignum f
(BIGNUM)。
BN_ucmp
然后比较bignums f
和模数n
。 >=0
表示f>=n
。
由于您的输入是SHA256摘要(256字节,2048位),因此转换的摘要的值可能大于2048位模数n
,因此会发生错误。
如果您可以将消息修改为较短的消息,那么这似乎是可行的。您正在调用的函数在将f^d mod n
计算为以下行
if (!rsa->meth->bn_mod_exp(ret,f,d,rsa->n,ctx,
rsa->_method_mod_n))
您可能希望切换到RSA_NO_PADDING
模式以获得预期答案。
答案 1 :(得分:1)
也许尝试使用-raw
参数。如果消息已填充到正确的大小,那么您不希望该实用程序尝试填充它。它默认为-pkcs
(PKCS 1.5),这可以解释为什么会出现“太大”的错误。