SHA-1 ダイジェスト (20 バイト) に署名するために使用したい 256 ビットの秘密鍵があります。openssl を直接使用するとうまくいくようです
エコーは関係ありません | openssl dgst -sha1 -バイナリ | openssl rsautl -sign -inkey 256bit_private_key.pem | openssl enc -base64
期待どおりのBase64出力が得られます。
しかし、OpenSSL でそれを行うと、「error:04075070:rsa routines:RSA_sign:digest too big for rsa key」で失敗します。以下に示すように、RSA_sign への入力として 20 バイト (SHA_DIGEST_LENGTH=20) の SHA-1 ダイジェストを渡しています。パディングがあっても、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;
[...]
}
コードで何が間違っていますか?