奔跑的大象 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格式的

    评论

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥15 如何修改pca中的feature函数
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况