奔跑的大象 2016-12-21 11:50 采纳率: 0%
浏览 1907
已结题

关于Openssl Rsa解析Base64数据的问题

问题是这样,客户端程序是用C++写的,服务端是用php写的,有这样一个场景,客户端接收到服务端用Base64加密的数据,
这里的数据要特别说明一下,这里的数据是通过openssl生成的公钥,再将要发送的数据通过公钥加密生成一个二进制流的数据,再通过Base64加密之后数据.
但是客户端解出来老是解不了,直接上代码,哪位有经验的大神帮忙看看是哪里出的问题.
代码1.

 //解码
size_t CBase64::Base64_Decode(char *pDest, const char *pSrc, size_t srclen)
{
    BYTE input[4];
    size_t i, index = 0;
    for(i = 0; i < srclen; i += 4)
    {
        //byte[0]
        input[0] = Decode_GetByte(pSrc[i]);
        input[1] = Decode_GetByte(pSrc[i + 1]);
        pDest[index++] = (input[0] << 2) + (input[1] >> 4);

        //byte[1]
        if(pSrc[i + 2] != '=')
        {
            input[2] = Decode_GetByte(pSrc[i + 2]);
            pDest[index++] = ((input[1] & 0x0f) << 4) + (input[2] >> 2);
        }

        //byte[2]
        if(pSrc[i + 3] != '=')
        {
            input[3] = Decode_GetByte(pSrc[i + 3]);
            pDest[index++] = ((input[2] & 0x03) << 6) + (input[3]);
        }            
    }

    //null-terminator
    pDest[index] = 0;
    return index;
}

我使用这个方法去解密接收到的Base64数据,发现只能解一半其它的数据都解不了,网上很多这样的方法都存在这个问题。
由于上面的代码解都解不完,我自己就改进了一下,代码如下:


//Base64解析
    size_t nDecodeSize = 0;
    //存储每次BASE64解析出来的数据(累加)
    std::string strBaseDecodeBuffer;
    //每次解析数据长度
    int nSingleBase64Length = 5;
    //当前解密总长度
    size_t nSumBaseCopyLength = 0;
    //临时变量,循环解析需要用到
    char *pszInDataTemp = pInDataBuffer;
    //存储拷贝的数据
    char *pszCopyData = new char[nSingleBase64Length];
        //存储Base64出来的数据
    char *pszDataDecryption = new char[nSingleBase64Length];
       //循环解析
    while(1)
    {
        //初始化数据
        ZeroMemory(pszCopyData,nSingleBase64Length);
        ZeroMemory(pszDataDecryption,nSingleBase64Length);
        char *pCurPos = pszInDataTemp+nSumBaseCopyLength;
        if(pCurPos == NULL)
        {
            break;
        }
        strncpy(pszCopyData,pCurPos,nSingleBase64Length);
        pszCopyData[nSingleBase64Length-1] = '\0';
        nSumBaseCopyLength+=nSingleBase64Length-1;
        nDecodeSize += CBase64::Base64_Decode(pszDataDecryption,pszCopyData,nSingleBase64Length-1);
        strBaseDecodeBuffer = strBaseDecodeBuffer+pszDataDecryption;
        if(nSumBaseCopyLength >= nInDataLength)
        {
            break;
        }
    }

通过这样循环调用的方式数据能完全解出来,但是用Rsa通过私钥来解又解不了,报error:0407106B:rsa routines:RSA_padding_check_PKCS1_type_2:block type is not 02的错。郁闷死我了

测试数据(这个就是服务端发回来的数据):MjNq9Ebg6K3rv1IVGvG2o9MRrGNEiJQy9FCE+m0jATU7IZBHQd0jHnn9b+ufHshE9QshN1w1Tw1+6GwmLOtD3iKCo7EyGjMQQ9SzfS7VYNM7HLjgTANVdJ6IJWUmvcFQiroZlY+0NzaDkPAvQQBlxER3hWZ2hnWV1yup84aDS1kG6wi00YRcxB43ZTMi3WaZyNXFvK2c8hM9c2jYfAMRlu70z5o62IeyHr2vuIY/PL0kL+yP0Fs6sG81i9IcTwzSLi/YQpOqZitMTI0Ds2cFR6Dm38CggB7T8ZdJPerLjB8RJykIgmTv0k1pxj3YSuY9DFP0YtE4j7lpttRbtdInJw==

openssl私钥:
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCoWzx/PfAoIJylsE4fZLeVQWy0UgEJikAHBB1tTO6Y5+0W4NEN
VY1hl0QnLQLffncVtcSECx30WELTEiOOY4eDTOFAkqtltbhfUgRkw3L6kXvWYevd
1m5besrsjWEqBxK6iuJLIL81nWT/jTYlnSMMVaWPSjcN34JV+n5qCT52twIBAwKB
gHA80v9+oBrAaG51iWpDJQ4rnc2MALEG1VoCvkjd9GXv82SV4LOOXkEPgsTIrJT+
+g55La1cvqLlgeIMF7RCWlZzu1xlGQfF3bZz3TLYrdfZdd/hGxSvd/ZPtYyWj+bB
DVA46t18MfDPeG9GjEP4CSu/R1pRX5oHGT8bMsLkWU8LAkEA05YNeIkV/FUvWzj0
nT9HlPvAiQ8fdcwXqSoj/G5rI2Yl1a6Te7+2L0JAc+EN4zE6nNtvkpUgyds6JtXY
eAnMLwJBAMuyKIJ8xBCWnkj/o+Eu7zZPRgc0H1luUloQda8a5MIYnF/Ta2q0ljbu
GC+CscXkEBnfGD2ShgsBPSrcbTqus/kCQQCNDrOlsLlS43Tne02+Ki+4p9WwtL+j
3WUbcW1S9Eds7sPjyben1SQfgYBNQLPsy3xokkphuMCGkibEjpBQBogfAkEAh8wb
AaiCtbm+21UX63SfeYour3gU5kmMPAr5H2dDLBBoP+JHnHhkJJ66ylchLpgKu+oQ
KQxZXKt+HJLzfHR3+wJABRrKEzuhp85AbIz4NM2TZ41v6JOwfmaDFQT+Zlj/ZL38
nrf5u/05N/nY96mt/ebvXxS3QGGlIIrKSqY+h1swjg==
-----END RSA PRIVATE KEY-----

//客户端Base64解析出来的数据:
23j鬎噼縍穸S琧D垟2鬚匉m#5;!怗A?y齩霟菵?!7\5O
~鑜&,隒?偅?3C猿}.誤?膏LUt瀳%e&搅P姾晱?6儛?A腄w協v唘曌+唭KY?囱刓?7e3"輋櫲张辑滘=sh貄栴粝?貒?蒋竼?<?/鞆衃:皁5嬕O?/谺摢f+LL?砱G犳呃爛玉桰=晁?')俤镆Mi?豃?S鬮?徆i对[狄''

个人感觉就是客户端解析Base64的问题。

  • 写回答

3条回答 默认 最新

  • oyljerry 2016-12-21 14:17
    关注

    OpenSSL生成公钥的时候,可以直接pem格式,他本身就是base64格式的

    评论

报告相同问题?

悬赏问题

  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥30 用arduino开发esp32控制ps2手柄一直报错
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题