繁体   English   中英

Openssl base64解码后的字符串并不总是解密

[英]Openssl base64 decoded string does not always decrypt

我正在尝试使用RSA_public_encrypt()使用公钥加密一些纯文本,然后将此数据发送到远程服务器进行验证。 我相信我有加密/解密工作,因为RSA_public_encrypt的输出可以传递给RSA_private_decrypt并且它可以工作。 我现在遇到的问题是我需要对数据进行base64编码,以便通过HTTP发送数据。

作为测试(在将其发送到服务器之前),我将编码为base64 RSA_public_encrypt()的输出,然后对其进行解码并将其传递回RSA_private_decrypt()。 这似乎在某些时候有效,并且失败并出现如下错误:

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

当我使用memcmp将原始数据(pre-base64)与base64解码函数的输出进行比较时,尽管内容看似匹配,但在Visual Studio中通过查看内存的内容为十六进制来获得-1。 我还使用各种在线工具检查了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

谢谢你的帮助!

你在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);
      }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM