次の例では、RSA 256-bit
private key
を使用して、パディングなしで32バイトメッセージを暗号化し、同じメモリブロックに結果を格納します。RSA_private_encryptの可能性のあるバグ
#include <openssl/ssl.h>
unsigned char err[256],
msg[] = "This is a message of some sort.",
key[] = "-----BEGIN RSA PRIVATE KEY-----\n"\
"MIGrAgEAAiEA6sZFpHqqFkpskc2GNMl6RHdiEuOqlX3LcW1TnYVgQFECAwEAAQIh\n"\
"AKqoe8FHJVJUwTzvMAo5FrU/t6Cc6GwYDELpU3xxs4nBAhEA+TwHM5ArwBgTtB2y\n"\
"AKlEKQIRAPElwlKWyde1KqHRCjOWX+kCEQDqWYZP9rUcp8cHKpDwTDiZAhBPldOd\n"\
"KDCzJRJN10yTm/RJAhANYsX4BteC/W7VRUjV5jSH\n"\
"-----END RSA PRIVATE KEY-----\n";
void main()
{
//msg[0] = 255;
if (RSA_private_encrypt(32, msg, msg,
PEM_read_bio_RSAPrivateKey(BIO_new_mem_buf(key, -1), NULL, NULL, NULL),
RSA_NO_PADDING) != 32)
{
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), err);
puts(err);
}
}
私たちがコメントを除去することにより、0番目のメッセージ文字の値を変更すると、暗号化はメッセージで失敗します。
rsa routines:RSA_EAY_PRIVATE_ENCRYPT:data too large for modulus
注非常に短いRSA
キーとハードコーディングされたメッセージの長さがその問題を示すためだけに使用されます。キーはopenssl
バイナリを使用して生成され、function
は異なるサイズのキーでも失敗します(4096ビットのキーの場合は、the msg[0] = 192
が原因)。
RSA_NO_PADDING
が明示的に指定されていても、関数が長さ記述子としてメッセージの先頭を解釈しているようです。これはバグですか?
あなたは256ビットモジュラスを持っておらず、255.875ビットモジュラスを持っています。 –