我正在尝试使用 RSA_public_encrypt() 使用公钥加密一些纯文本,然后该数据将被发送到远程服务器进行验证。我相信我的加密/解密工作正常,因为 RSA_public_encrypt 的输出可以传递给 RSA_private_decrypt 并且它可以工作。我现在遇到的问题是我需要对数据进行 Base64 编码才能通过 HTTP 发送。
\n\n作为测试(在将其发送到服务器之前),我将 RSA_public_encrypt() 的输出编码为 base64,然后对其进行解码并将其传递回 RSA_private_decrypt()。这似乎有时有效,但会失败并出现如下错误:
\n\nerror:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error\n
Run Code Online (Sandbox Code Playgroud)\n\n当我使用 memcmp 将原始数据(base64 之前)与 Base64 解码函数的输出进行比较时,尽管内容看起来匹配(在 Visual Studio 中通过以十六进制形式查看内存内容),我还是收到了 -1。我还使用各种在线工具检查了 Base64 编码版本,它们似乎解码为预期值。
\n\n我已经仔细检查过 base64/unbase64 函数的输入/输出是否以 null 结尾,这似乎没有什么区别。
\n\n我已经在这个问题上绕了好几天了,但我相信这一定是与 Base64 编码/解码过程有关的问题,因为当不涉及这个问题时,一切都会正常。如果有人对如何发生这种情况有任何建议,我们将不胜感激。
\n\nOpenssl版本: 1.0.1c
\n\n平台: Windows/MSVC
\n\nBase64 代码:
\n\nchar *base64(const unsigned char *input, int length)\n{\n BIO *bmem, *b64;\n BUF_MEM *bptr;\n char *buff = NULL;\n\n b64 = BIO_new(BIO_f_base64());\n BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);\n bmem = BIO_new(BIO_s_mem());\n b64 = BIO_push(b64, bmem);\n BIO_write(b64, input, length);\n BIO_flush(b64);\n BIO_get_mem_ptr(b64, &bptr);\n\n buff = (char *)malloc(bptr->length+1);\n memcpy(buff, bptr->data, bptr->length);\n buff[bptr->length] = \'\\0\';\n\n BIO_free_all(b64);\n\n return buff;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\nUnbase64 代码:
\n\nchar *unbase64(unsigned char *input, int length)\n{\n BIO *b64, *bmem;\n\n char *buffer = (char *)malloc(length+1);\n memset(buffer, 0, length+1);\n\n b64 = BIO_new(BIO_f_base64());\n BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);\n bmem = BIO_new_mem_buf(input, length);\n bmem = BIO_push(b64, bmem);\n\n BIO_read(bmem, buffer, length);\n buffer[length] = \'\\0\';\n\n BIO_free_all(bmem);\n\n return buffer;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n加密的“hello world”示例:
\n\n\xc5\xa1:\xc5\x92\xc2\xbcJ\xc5\x92"\xc3\x8c\xc3\xaf\xc3\xab\xc5\xb8\xc3\x94\xc3\xa8#\xc2\xa2Oo\xe2\x80\x9a\xc3\x80\xe2\x80\x93 \xc5\x93\xc3\xaa\\\xc3\xa7r\xc3\xba\xc2\xbf\xc2\xb1a/8\xc6\x92\xc3\xb2\xc3\x8c\xc2\xa2Q\\T\xc2\xb9]n\xc3\xado\n
Run Code Online (Sandbox Code Playgroud)\n\nBase64版本(使用上面的代码):
\n\nG5qdOgWMvEqMIswZ7+uf1OgPI6JPb4LAlgmc6lzncvq/sWEvOIPyzByiUVwMjYFUuV0Vbu1v\n
Run Code Online (Sandbox Code Playgroud)\n\n谢谢你的帮助!
\n您在函数中传递了正确的大小unbase64
吗?它应该是返回的 base64 缓冲区的大小,而不是目标缓冲区的大小,即使用示例 main 函数:
int main(void)
{
unsigned char bufron[2000];
int i;
char *chab;
unsigned char *chac;
for (i = 0; i < 2000; i++) {
bufron[i] = i % 255;
}
chab = base64(bufron, 2000);
printf("%s\n", chab);
chac = unbase64(chab, strlen(chab));
for (i = 0; i < 2000; i++) {
if (bufron[i] != chac[i]) {
printf("Failed at %d\n", i);
return (1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5204 次 |
最近记录: |