|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 sankeyou 于 2012-1-9 21:26 编辑
动态加解密就是说同样的内容,每次加密的结果都不一样,但是还能解出来
例子程序使用vc++6.0编写
支持任何数据动态加解密,如:字符串,结构体等.我目前用于封包加解密中.
加密函数:
- // 参数1:加密后的字符串存放位置
- // 参数2:待加密明文
- // 参数3:待加密明文长度
- // 参数4:用作加密的key
- // 返回值:加密后的字符串长度
- int Encryption(char *pDst, const char *pSrc, int nSrcLen,
- const char *pKey = "ssdfj23@#$^**&)(~!!~!~!~!~!sd;lkf")
- {
- if (pDst == NULL || pSrc == NULL || nSrcLen == 0)
- {
- return 0;
- }
- // 密匙长度
- int nKeyLen = strlen(pKey);
- // 新的密匙
- char *pNewKey = (char *)malloc(nKeyLen + sizeof(char));
- if (pNewKey == NULL)
- {
- return 0;
- }
- memset(pNewKey, '\0', nKeyLen + sizeof(char));
- memcpy(pNewKey, pKey, nKeyLen);
- // 启动时间
- int nStartTime = GetTickCount();
- // 密匙时间
- int nKeyTime = nStartTime;
- // 取2 - 255 之间的随机数
- srand((unsigned int)time(0));
- int nRand = 2 + rand() % (255 - 2);
- int i = 0;
- int nCount = 0;
- // nKeyTime 每个字节 = nStartTime[i] ^ nRand, 产生一个新的 nKeyTime
- for (i = 0; i < 4; i++)
- {
- ((char*)&nKeyTime)[i] = ((char*) & nStartTime)[i] ^ nRand;
- }
- // 把 pNewKey 和 nKeyTime 每个字节顺序 ^, 产生一个新的key
- for (i = 0; i < nKeyLen; i++)
- {
- pNewKey[i] ^= ((char*) & nKeyTime)[nCount];
- nCount++;
- if (nCount > 3)
- {
- nCount = 0;
- }
- }
- for (i = 0; i < nSrcLen; i++)
- {
- pDst[i + sizeof(nKeyTime) + sizeof(nRand)] = pSrc[i];
- // 当前字节先和 key 异或一遍
- for (int j = 0; j < nKeyLen; j++)
- {
- pDst[i + sizeof(nKeyTime) + sizeof(nRand)] ^= pNewKey[j];
- }
- // 在和启动时间当前计数异或一遍
- pDst[i + sizeof(nKeyTime) + sizeof(nRand)] ^= ((char*) & nStartTime)[nCount];
- nCount++;
- if (nCount > 3)
- {
- nCount = 0;
- }
- }
- nRand = ~nRand;
- nRand ^= nKeyTime;
- // nRand
- memcpy(pDst, (char *)&nRand, sizeof(nRand));
- // ## nKeyTime
- memcpy(pDst + sizeof(nRand), (char *)&nKeyTime, sizeof(nKeyTime));
- if (pNewKey != NULL)
- {
- free(pNewKey);
- pNewKey = NULL;
- }
- return nSrcLen + sizeof(nKeyTime) + sizeof(nRand);
- }
复制代码
解密函数:
- // 参数1:解密后的字符串存放位置
- // 参数2:待解密密文
- // 参数3:待解密密文长度
- // 参数4:用作解密的key
- // 返回值:解密后的字符串长度
- int Decryption(char *pDst, const char *pSrc, int nSrcLen,
- const char *pKey = "ssdfj23@#$^**&)(~!!~!~!~!~!sd;lkf")
- {
- if (pDst == NULL || pSrc == NULL || nSrcLen < 9)
- {
- return 0;
- }
- // 密匙长度
- int nKeyLen = strlen(pKey);
- // 取出那个随机数
- int nRand = *(int *)pSrc ^ *(int *)(pSrc + 4);
- nRand = ~nRand;
- // 新的源内容
- char *pNewSrc = (char *)malloc(nSrcLen + sizeof(char));
- if (pNewSrc == NULL)
- {
- return 0;
- }
- memset(pNewSrc, '\0', nSrcLen + sizeof(char));
- memcpy(pNewSrc, pSrc + 4, nSrcLen);
- int i = 0;
- int nKeyTime = 0, nKeyTime2 = 0;
- for (i = 0; i < 4; i++)
- {
- ((char *)&nKeyTime)[i] = pNewSrc[i];
- ((char *)&nKeyTime2)[i] = pNewSrc[i] ^ nRand;
- }
- int nNewSrcLen = nSrcLen - 8;
- int nCount = 0;
- memset(pNewSrc, '\0', nSrcLen + sizeof(char));
- memcpy(pNewSrc, pSrc + 8, nNewSrcLen);
- // 新的密匙
- char *pNewKey = (char *)malloc(nKeyLen + sizeof(char));
- if (pNewKey == NULL)
- {
- return 0;
- }
- memset(pNewKey, '\0', nKeyLen + sizeof(char));
- memcpy(pNewKey, pKey, nKeyLen);
- for (i = 0; i < nKeyLen; i++)
- {
- pNewKey[i] ^= ((char *) & nKeyTime)[nCount];
- nCount++;
- if (nCount > 3)
- {
- nCount = 0;
- }
- }
- for (i = 0; i < nNewSrcLen; i++)
- {
- pDst[i] = pNewSrc[i] ^((char*) & nKeyTime2)[nCount];
- for (int j = 0; j < nKeyLen; j++)
- {
- pDst[i] ^= pNewKey[j];
- }
- nCount++;
- if (nCount > 3)
- {
- nCount = 0;
- }
- }
- if (pNewSrc != NULL)
- {
- free(pNewSrc);
- pNewSrc = NULL;
- }
- if (pNewKey != NULL)
- {
- free(pNewKey);
- pNewKey = NULL;
- }
- return nNewSrcLen;
- }
复制代码
使用例子:
PS:加解密的执行效率,取决于Key的长度,key越长就越慢,不可不免,但是这2个函数,效率依然很高,key长一些就相对安全一些.
PS:加密后存储的buffer要比加密前的大8个字节,解密后的buffer比解密前的可以小8个字节.
delphi版本连接 http://bbs.fishc.com/forum.php?mod=viewthread&tid=12970&page=1&extra=#pid124313
|
评分
-
参与人数 1 | 荣誉 +10 |
鱼币 +10 |
收起
理由
|
小甲鱼
| + 10 |
+ 10 |
非常不错,支持分享!另外很美观! |
查看全部评分
|