2012-05-27 49 views
4

我想用公钥加密一些纯文本使用RSA_public_encrypt(),然后这个数据将被发送到远程服务器进行验证。我相信我的加密/解密工作,因为RSA_public_encrypt的输出可以传递给RSA_private_decrypt,它的工作原理。我现在遇到的问题是我需要base64编码数据才能通过HTTP发送。Openssl base64解码字符串并不总是解密

作为一个测试(在发送到服务器之前),我将base64编码为RSA_public_encrypt()的输出,然后解码并将其传回RSA_private_decrypt()。这似乎工作一些时间,和失败,这样的错误:

error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error 

当我使用memcmp原始数据(前的base64)比较,以我的base64解码功能的输出我收到了 - 1,尽管内容显示为匹配(在Visual Studio中,通过查看内存内容为十六进制)。我还用各种在线工具检查了base64编码版本,并且它们似乎解码为期望值。

我有双重检查,从base64/unbase64函数的输入/输出是零终止似乎没有什么区别。

我已经围绕这个问题绕了两天,但我相信它必须是base64编码/解码过程的东西,因为当这不涉及一切正常。如果任何人有任何关于如何发生这种情况的建议,将不胜感激。

Openssl的版本: 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] = '\0'; 

    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] = '\0'; 

    BIO_free_all(bmem); 

    return buffer; 
} 

加密的 “Hello World” 的例子:

š:Œ¼JŒ"ÌïëŸÔè#¢Oo‚À– œê\çrú¿±a/8ƒòÌ¢Q\T¹]nío 

Base64编码的版本(使用上面的代码):

G5qdOgWMvEqMIswZ7+uf1OgPI6JPb4LAlgmc6lzncvq/sWEvOIPyzByiUVwMjYFUuV0Vbu1v 

感谢您的帮助!

回答

0

您在unbase64函数中传入正确的大小?它应该是BASE64缓冲区的大小返回,目标缓冲区的不是大小,即用一个例子主要功能:

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); 
     } 
    } 
} 
+1

大小被传递到'unbase64'是正确的,但你的回答让我检查所有大小。原来我在调用'base64()'时没有使用正确的长度。我使用'base64(str,strlen(str))',但是二进制字符串必须包含NULL。将它改为'base64(str,256)'解决了这个问题。 (其中256是openssl报告的字符串大小)。谢谢! – Andrew