OpenSSL RSA_public_encrypt的奇怪行为[英] OpenSSL RSA_public_encrypt strange behavior

本文是小编为大家收集整理的关于OpenSSL RSA_public_encrypt的奇怪行为的处理方法,想解了OpenSSL RSA_public_encrypt的奇怪行为的问题怎么解决?OpenSSL RSA_public_encrypt的奇怪行为问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试使用 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 结构 的 exponent 和 modulus 是恒定的,并且每个输入数据都相同称呼.

那么为什么 RSA_public_encrypt 会这样呢?

我应该如何根据exponent和modulus生成一个用于RSA加密的公钥?

我在哪里犯错了?

推荐答案

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

RSA加密过程其实是:

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

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

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

简单的解释是 OAEP 填充使用一些随机值作为填充,因此 xxxxxxxABC 和 yyyyyyyABC 和 zzzzzzzABC 都是纯文本的有效编码纯文本值,而这些编码纯文本加密为不同的值.如果您执行相应的解密(和解码,通过将相同的 RSA_PKCS1_OAEP_PADDING 参数传递给 RSA_private_decrypt)操作,您仍然应该得到"ABC"作为每个密文的输出,因为填充剥离了所有三个.

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

本文地址:https://www.itbaoku.cn/post/924631.html