0

我正在尝试使用 OpenSSL 在 C 中编写一个简单的加密例程,但我发现了一些奇怪的东西。我不是 C 大师,也不是 OpenSSL 专业人士。所以我可能犯了一个错误。

功能如下

char *rsa_encrypt(char *data)
{
    const char xponent_in_hex[] = "010001";
    const char modulus_in_hex[] = "D0BA16F11907E7B0819705A15264AC29BEE9F1EC5F22642992
    D3E27100B7F212864A624A12FFB6D531712B0B0225AAD0C2E313D077A7DB2A5A33483EEFF41A9D";    

    BIGNUM *xponent = NULL;
    BIGNUM *modulus = NULL;

    BN_hex2bn(&xponent, xponent_in_hex);
    BN_hex2bn(&modulus, modulus_in_hex);

    RSA *rsa = RSA_new();
    rsa->e = xponent;
    rsa->n = modulus;
    rsa->iqmp = NULL;
    rsa->d = NULL;
    rsa->p = NULL;
    rsa->q = NULL;

    char encoded[512] = { 0 };
    RSA_public_encrypt(
    strlen(data), 
    (const unsigned char *)data, 
    (unsigned char *)encoded,
    rsa, 
    RSA_PKCS1_OAEP_PADDING
);

    RSA_free(rsa);

    return (encoded);
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%s\n", base64_encode(rsa_encrypt("ABC")));
    printf("%s\n", base64_encode(rsa_encrypt("ABC")));
    printf("%s\n", base64_encode(rsa_encrypt("ABC")));
}

我多次在相同的数据上调用该函数,每次调用它都会生成不同的值。这显然是错误的,因为创建的RSA 结构的指数模数是恒定的,并且每次调用中的输入数据都是相同的。

那么为什么RSA_public_encrypt会这样呢?

我应该如何为基于指数模数的 RSA 加密生成公钥?

我在哪里犯了错误?

4

2 回答 2

5

这实际上是正确的,你没有犯错。您的困惑源于RSA_PKCS1_OAEP_PADDING参数 to RSA_public_encrypt

RSA加密过程其实是:

  1. 获取明文(plain)并对其进行编码,生成encoded_plain。
  2. 加密encoded_plain。

(如您所料,解密过程要求您先解密该值,然后再解码消息)。

RSA_PKCS1_OAEP_PADDING参数指定应如何编码明文(应使用 OAEP 编码)。

一个简化的解释是 OAEP 填充使用一些随机值作为填充,因此xxxxxxxABCyyyyyyyABCzzzzzzzABC都是纯文本的有效编码纯文本值,并且那些编码纯文本加密为不同的值。如果您执行相应的解密(和解码,通过将相同的RSA_PKCS1_OAEP_PADDING参数传递给RSA_private_decrypt)操作,您仍然应该获得“ABC”作为每个密文的输出,因为填充剥离了所有三个密文。

(如果你想准确一点,OAEP 编码方案更复杂,请参阅RFC 3447 第 7.1.1 节。但这些可能是你不关心的细节。)

于 2012-11-15T03:32:21.110 回答
0

The scope of encoded ends at the end of the rsa_encrypt function. Your return pointer will point to an invalid area of memory, that might not contain what you expect anymore because somebody else (another thread, for example) wrote over it. The answer explaining the padding is correct.

于 2014-01-13T23:16:55.440 回答