问题是这样,客户端程序是用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的问题。