一种使用命令行openssl 对填充的 SHA256 哈希进行 RSA "encryption"的方法



我正在尝试使用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(我理解这是具有相同结果的首选方法)。我很确定我走错了路,也许这是不可能从命令行(我知道这是可行的从C API使用"bignum")。

——update ----

我试着从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都不同意我从第三方工具得到的计算

您得到的错误,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 (unsigned char*)转换为bignum f (bignum)。然后BN_ucmp比较双量值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模式以获得预期的答案。

也许可以尝试使用-raw参数。如果消息已经填充到正确的大小,那么您不希望实用程序尝试填充它。默认情况下,它假设-pkcs (PKCS 1.5),这可以解释为什么您会得到"太大"的错误。

最新更新