读书人

DES加密加密字符串太长,以致解密不全

发布时间: 2013-08-04 18:26:16 作者: rapoo

DES加密,加密字符串太长,导致解密不全
用 DES_cfb64_encrypt 函数加解密。

如果加密的字符串 太长,假设为 n 个字符;
在解析的时候,会把会面的一部分字符串丢掉。

有的时候是正常的,换一些其他的字符,可能会解析补全。
小例子见下,只看算法就行,其他忽略~~~


int main(int argc, char * argv[])
{
//test
string token="";
string key = "ccccccccc";

//creat token
//string tmpStr = ip + "|" + expireTime;
//string tmpStr = "ABC+192.168.102.20+123123+1374121139+cc17aa946b9813c3615bdbde727d7f6c";
//string tmpStr = "ABC+192.168.102.20+123123+1374123631+30935773f402f3ea16542a5b62070192";
string tmpStr = "ABCABC+192.168.102.20+123123+1374125883+4ee009f5459edcdfdfa6abb1bb8d4a4c";
char decryptBuf[44096]={};
char binaryBuf[44096]={};
for(unsigned int i=0; i<tmpStr.size(); i++)
{
decryptBuf[i] = tmpStr.c_str()[i];
}
unsigned char newKey[8];
unsigned char aKey[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
unsigned char iv[8] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x8};
for(int i = 0; i < 8; i ++)
{
newKey[i] = key[i] ^ aKey[i];
printf("%c\n",newKey[i]);
}
printf("\n");
des_key_schedule ks;
des_set_key_unchecked(&newKey, ks);
int decryptSize = 0;
DES_cfb64_encrypt((unsigned char*)decryptBuf,(unsigned char*)binaryBuf, strlen(decryptBuf),&ks,&iv,&decryptSize, DES_ENCRYPT);



unsigned char newBinaryBuf[44096]={};
printf("strlen(binaryBuf)=%d\n",strlen(binaryBuf));
for(unsigned int i = 0; i < strlen(binaryBuf); i++)
{
printf("%d ",i);
newBinaryBuf[i] = binaryBuf[i];
char tmpNum[10] = "";
sprintf(tmpNum, "%02x", newBinaryBuf[i]);
token += tmpNum;
}
printf("get token[%s]\n", token.c_str());

const char *tokenStr = token.c_str();
char authKeyTmp[44096], binaryBuf[44096];
char decryptBuf[44096]={};
strncpy(authKeyTmp, tokenStr , 44096);
int bufSize = 0;
printf("token size = %d\n", strlen(authKeyTmp));
if(!hex2Binary(authKeyTmp, binaryBuf, &bufSize))
{
printf("convert authkey from hex to binary fail\n");
}
printf("token size = %d\n", strlen(binaryBuf));

unsigned char newKey[8];
unsigned char aKey[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
unsigned char iv[8] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x8};
for(int i = 0; i < 8; i ++)
newKey[i] = key[i] ^ aKey[i];
des_key_schedule ks;
des_set_key_unchecked(&newKey, ks);


int decryptSize = 0;
DES_cfb64_encrypt((unsigned char*)binaryBuf, (unsigned char*)decryptBuf, bufSize,&ks,&iv,&decryptSize, DES_DECRYPT);
string tmpStr = decryptBuf;
printf("AAAAAAAAAAAAA %s\n",tmpStr.c_str());
return 0;


DES 加密 解密
[解决办法]
DES 是将64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。所以DES加密对明文是有限制的,只会对64位明文即8个字节的数据加密,而不是你想要的n个字节。
[解决办法]
DES_cfb64_encrypt 对需要加密的字符串长度有限制吗? 不是分成多组8字节为一组的字符串进行分别加密吗?

读书人网 >C语言

热点推荐