使用 openssl.exe 使用 256 位 RSA 密钥对 20 字节消息进行签名,但不在代码中

2024-02-17

我有一个 256 位私钥,我想用它来签署 SHA-1 摘要(20 字节)。直接使用 openssl 似乎可以工作

回声并不重要| openssl dgst -sha1 -二进制 | openssl rsautl -sign -inkey 256bit_private_key.pem | openssl rsautl -sign -inkey 256bit_private_key.pem | openssl enc -base64

给我一个预期的 Base64 输出。

但是使用 OpenSSL 执行此操作会失败,并显示“错误:04075070:rsa 例程:RSA_sign:digest 对于 rsa 密钥来说太大”。如下所示,我将 20 字节 (SHA_DIGEST_LENGTH=20) SHA-1 摘要作为 RSA_sign 的输入传递。即使使用填充,它也不应该超过我可以使用 256 位模数密钥加密的最大 32 字节?!

unsigned char digest[SHA_DIGEST_LENGTH];
SHA1(message, messageSize, digest);

unsigned int privateKeySize = RSA_size(privateKey); // 256 bits = 32 bytes
unsigned char* signature = new unsigned char[privateKeySize];
unsigned int signatureSize;

int res = RSA_sign(NID_sha1, digest, SHA_DIGEST_LENGTH, signature, &signatureSize, privateKey);

if(res == 0)
{
    int err = ERR_get_error(); // 67588208
    char *s = ERR_error_string(err, 0); // error:04075070:lib(4):func(117):reason(112)

    delete [] signature;

    [...]
}

我在代码中做错了什么?


看看这个所以答案 https://stackoverflow.com/a/10443732/1904979. rsautl已被弃用,有利于pkeyutl

本质上,RSA 签名应该使用 RSA-PSS 签名填充方案来确保安全,并且 RSA-PSS 将严格大于摘要,因为需要传递盐。此外,RSA_sign作为签名方案的一部分进行摘要,因此您的代码将进行摘要的摘要。您想直接传递消息,或者使用RSA_private_encrypt结合合适的RSA_padding_add_x call.

正如我在评论中所说,256 位密钥对于对称算法来说足够安全,但破解 RSA 私钥(大约为在几年前的机器上 4 分钟 https://math.stackexchange.com/a/28678)。使用至少 1024 位密钥(可能还有 2048 或 4096 位密钥)将为您提供安全级别 http://www.cryptopp.com/wiki/Security_Level大致相当于 128 位对称算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 openssl.exe 使用 256 位 RSA 密钥对 20 字节消息进行签名,但不在代码中 的相关文章

随机推荐