我有一个 256 位私钥,我想用它来签署 SHA-1 摘要(20 字节)。直接使用openssl似乎可以工作
回声无关紧要 | openssl dgst -sha1 -binary | openssl rsautl -sign -inkey 256bit_private_key.pem | openssl enc -base64
给了我预期的 Base64 输出。
但是使用 OpenSSL 失败并显示“错误:04075070:rsaroutines:RSA_sign:digest too big for rsa key”。正如您在下面看到的,我将 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;
[...]
}
我在代码中做错了什么?