首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-08-04 
DES加密,加密字符串太长,导致解密不全用 DES_cfb64_encrypt 函数加解密。 如果加密的字符串 太长,假设为 n

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字节为一组的字符串进行分别加密吗?

热点排行