gpt4 book ai didi

ios - OpenSSL RSA_public_encrypt 奇怪的行为

转载 作者:行者123 更新时间:2023-11-28 18:39:20 24 4
gpt4 key购买 nike

我正在尝试使用 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加密生成公钥?

我哪里做错了?

最佳答案

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

RSA加密过程其实是:

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

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

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

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

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

关于ios - OpenSSL RSA_public_encrypt 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13389211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com