- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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加密过程其实是:
(如您所料,解密过程要求您解密值,然后解码消息)。
RSA_PKCS1_OAEP_PADDING
参数指定应如何对明文进行编码(应使用 OAEP 编码)。
一个简单的解释是OAEP padding使用一些随机值来填充,所以xxxxxxxABC
和yyyyyyyABC
和zzzzzzzABC
都是有效的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/
下面是我更新的代码。这适用于加密但无法解密。我不想要填充,因此我不使用填充,这也确保每次运行的加密输出都相同。 #include #include #include #include #inc
我正在尝试使用 OpenSSL 在 C 中编写一个简单的加密例程,但我发现了一些奇怪的东西。我不是 C 大师,也不是 OpenSSL 专家。所以我可能犯了一个错误。 函数如下 char *rsa_en
我正在尝试使用 RSA_public_encrypt 加密数据,但它似乎不起作用(retEnc 始终为 -1)。我还尝试使用 ERR_get_error 和 ERR_error_string 查找有关
我正在尝试使用 RSA_public_encrypt 加密十进制数字 1,不带填充。当然这次加密的结果应该又是1。但实际上是 密码: 522867335089565389638320105881546
RSA_size(rsa) 在我的应用程序中返回等于 256 的模数。我正在使用 RSA_PKCS1_OAEP_PADDING 选项加密数据,因此发送到 RSA_public_encrypt() 的输
我一直在尝试使用 openssl 的 RSA_public_encrypt 加密测试字符串,但在我尝试运行它的每一种方式中都会导致段错误。 我尝试使用 BIO 检查我从 pem 文件中读取的 RSA
我是一名优秀的程序员,十分优秀!