我试图用RSA_ public_ encrypt () 用公用密钥加密一些普通文本, 这样数据就会被发送到远程服务器进行验证。 我相信, 加密/ 解密工作正常, 因为 RSA_ public_ encrypt 的输出可以传送到 RSA_ public_ decrypt 并且有效 。 我现在的问题是, 我需要将数据编码64 为基础, 才能发送到 HTTP 上 。
作为测试( 在将它发送到服务器之前) 我将 RSA_ public_ encrypt () 的输出编码为64, 然后解码并将其传送回 RSA_ public_ decrypt () 。 这似乎有一段时间有效, 并且以这样的错误失败 :
error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error
当我使用Memcmp来比较原始数据( base64 前) 和我的 base64 解码函数的输出时, 尽管内容似乎匹配( 在视觉工作室, 查看内存内容为十六进制), 我仍然收到一个 - 1 。 我还用各种在线工具检查了基数64 编码版本, 它们似乎解码为预期值 。
我重复检查过基数64/unbase64 函数的输入/产出无效,这似乎没有什么区别。
这个问题我一直在兜圈子呆了好几天,但我相信这一定与64基数编码/编码过程有关,因为当它不涉及时,一切都会起作用。如果有人对如何发生这种情况有任何建议的话,那将不胜感激。
<强度 > Opensl 版本: 强度 > 1. 0.1c
<强度>平台: 强度> Windows/MSVC
<强度 > Base64 代码: 强 >
char *base64(const unsigned char *input, int length)
{
BIO *bmem, *b64;
BUF_MEM *bptr;
char *buff = NULL;
b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bmem = BIO_new(BIO_s_mem());
b64 = BIO_push(b64, bmem);
BIO_write(b64, input, length);
BIO_flush(b64);
BIO_get_mem_ptr(b64, &bptr);
buff = (char *)malloc(bptr->length+1);
memcpy(buff, bptr->data, bptr->length);
buff[bptr->length] = ;
BIO_free_all(b64);
return buff;
}
<强> Unbase64 代码: 强>
char *unbase64(unsigned char *input, int length)
{
BIO *b64, *bmem;
char *buffer = (char *)malloc(length+1);
memset(buffer, 0, length+1);
b64 = BIO_new(BIO_f_base64());
BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
bmem = BIO_new_mem_buf(input, length);
bmem = BIO_push(b64, bmem);
BIO_read(bmem, buffer, length);
buffer[length] = ;
BIO_free_all(bmem);
return buffer;
}
< 强度 > 加密“ hello world” 示例: 强度 >
š:Œ¼JŒ"ÌïëŸÔè#¢Oo‚À– œêçrú¿±a/8ƒòÌ¢QT¹]nío
<强度>Base64 版本(使用上述代码): 强度>
G5qdOgWMvEqMIswZ7+uf1OgPI6JPb4LAlgmc6lzncvq/sWEvOIPyzByiUVwMjYFUuV0Vbu1v
谢谢你的帮助!