鱼C论坛

 找回密码
 立即注册
查看: 5754|回复: 15

[技术交流] 新鲜出炉动态加解密,纯手工打造c++版.

[复制链接]
发表于 2012-1-9 21:20:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 sankeyou 于 2012-1-9 21:26 编辑

动态加解密就是说同样的内容,每次加密的结果都不一样,但是还能解出来

                               
登录/注册后可看大图


例子程序使用vc++6.0编写

支持任何数据动态加解密,如:字符串,结构体等.我目前用于封包加解密中.

加密函数:

  1. // 参数1:加密后的字符串存放位置
  2. // 参数2:待加密明文
  3. // 参数3:待加密明文长度
  4. // 参数4:用作加密的key
  5. // 返回值:加密后的字符串长度
  6. int Encryption(char *pDst, const char *pSrc, int nSrcLen,
  7.                            const char *pKey = "ssdfj23@#$^**&)(~!!~!~!~!~!sd;lkf")
  8. {
  9.     if (pDst == NULL || pSrc == NULL || nSrcLen == 0)
  10.     {
  11.         return 0;
  12.     }

  13.     // 密匙长度
  14.     int nKeyLen = strlen(pKey);

  15.     // 新的密匙
  16.     char *pNewKey = (char *)malloc(nKeyLen + sizeof(char));
  17.     if (pNewKey == NULL)
  18.     {
  19.         return 0;
  20.     }

  21.     memset(pNewKey, '\0', nKeyLen + sizeof(char));
  22.     memcpy(pNewKey, pKey, nKeyLen);

  23.     // 启动时间
  24.     int nStartTime = GetTickCount();


  25.     // 密匙时间
  26.     int nKeyTime = nStartTime;

  27.     // 取2 - 255 之间的随机数
  28.     srand((unsigned int)time(0));
  29.     int nRand = 2 + rand() % (255 - 2);

  30.     int i = 0;
  31.     int nCount = 0;

  32.     // nKeyTime 每个字节 = nStartTime[i] ^ nRand, 产生一个新的 nKeyTime
  33.     for (i = 0; i < 4; i++)
  34.     {
  35.         ((char*)&nKeyTime)[i] = ((char*) & nStartTime)[i] ^ nRand;
  36.     }

  37.     // 把 pNewKey 和 nKeyTime 每个字节顺序 ^, 产生一个新的key
  38.     for (i = 0; i < nKeyLen; i++)
  39.     {
  40.         pNewKey[i] ^= ((char*) & nKeyTime)[nCount];

  41.         nCount++;
  42.         if (nCount > 3)
  43.         {
  44.             nCount = 0;
  45.         }
  46.     }

  47.     for (i = 0; i < nSrcLen; i++)
  48.     {

  49.         pDst[i + sizeof(nKeyTime) + sizeof(nRand)] = pSrc[i];
  50.         // 当前字节先和 key 异或一遍
  51.         for (int j = 0; j < nKeyLen; j++)
  52.         {
  53.             pDst[i + sizeof(nKeyTime) + sizeof(nRand)] ^= pNewKey[j];
  54.         }

  55.         // 在和启动时间当前计数异或一遍
  56.         pDst[i + sizeof(nKeyTime) + sizeof(nRand)] ^= ((char*) & nStartTime)[nCount];

  57.         nCount++;
  58.         if (nCount > 3)
  59.         {
  60.             nCount = 0;
  61.         }
  62.     }

  63.     nRand = ~nRand;

  64.     nRand ^= nKeyTime;

  65.     // nRand
  66.     memcpy(pDst, (char *)&nRand, sizeof(nRand));

  67.     // ## nKeyTime
  68.     memcpy(pDst + sizeof(nRand), (char *)&nKeyTime, sizeof(nKeyTime));


  69.     if (pNewKey != NULL)
  70.     {
  71.         free(pNewKey);
  72.         pNewKey = NULL;
  73.     }

  74.     return nSrcLen + sizeof(nKeyTime) + sizeof(nRand);
  75. }
复制代码



解密函数:

  1. // 参数1:解密后的字符串存放位置
  2. // 参数2:待解密密文
  3. // 参数3:待解密密文长度
  4. // 参数4:用作解密的key
  5. // 返回值:解密后的字符串长度
  6. int Decryption(char *pDst, const char *pSrc, int nSrcLen,
  7.                            const char *pKey = "ssdfj23@#$^**&)(~!!~!~!~!~!sd;lkf")
  8. {

  9.     if (pDst == NULL || pSrc == NULL || nSrcLen < 9)
  10.     {
  11.         return 0;
  12.     }

  13.     // 密匙长度
  14.     int nKeyLen = strlen(pKey);

  15.     // 取出那个随机数
  16.     int nRand = *(int *)pSrc ^ *(int *)(pSrc + 4);
  17.     nRand = ~nRand;

  18.     // 新的源内容
  19.     char *pNewSrc = (char *)malloc(nSrcLen + sizeof(char));
  20.     if (pNewSrc == NULL)
  21.     {
  22.         return 0;
  23.     }

  24.     memset(pNewSrc, '\0', nSrcLen + sizeof(char));
  25.     memcpy(pNewSrc, pSrc + 4, nSrcLen);

  26.     int i = 0;
  27.     int nKeyTime = 0, nKeyTime2 = 0;

  28.     for (i = 0; i < 4; i++)
  29.     {
  30.         ((char *)&nKeyTime)[i] = pNewSrc[i];
  31.         ((char *)&nKeyTime2)[i] = pNewSrc[i] ^ nRand;
  32.     }

  33.     int nNewSrcLen = nSrcLen - 8;
  34.     int nCount = 0;

  35.     memset(pNewSrc, '\0', nSrcLen + sizeof(char));
  36.     memcpy(pNewSrc, pSrc + 8, nNewSrcLen);

  37.     // 新的密匙
  38.     char *pNewKey = (char *)malloc(nKeyLen + sizeof(char));
  39.     if (pNewKey == NULL)
  40.     {
  41.         return 0;
  42.     }
  43.     memset(pNewKey, '\0', nKeyLen + sizeof(char));
  44.     memcpy(pNewKey, pKey, nKeyLen);

  45.     for (i = 0; i < nKeyLen; i++)
  46.     {
  47.         pNewKey[i] ^= ((char *) & nKeyTime)[nCount];

  48.         nCount++;
  49.         if (nCount > 3)
  50.         {
  51.             nCount = 0;
  52.         }
  53.     }


  54.     for (i = 0; i < nNewSrcLen; i++)
  55.     {
  56.         pDst[i] = pNewSrc[i] ^((char*) & nKeyTime2)[nCount];

  57.         for (int j = 0; j < nKeyLen; j++)
  58.         {
  59.             pDst[i] ^= pNewKey[j];
  60.         }

  61.         nCount++;
  62.         if (nCount > 3)
  63.         {
  64.             nCount = 0;
  65.         }

  66.     }

  67.     if (pNewSrc != NULL)
  68.     {
  69.         free(pNewSrc);
  70.         pNewSrc = NULL;
  71.     }

  72.     if (pNewKey != NULL)
  73.     {
  74.         free(pNewKey);
  75.         pNewKey = NULL;
  76.     }

  77.     return nNewSrcLen;
  78. }
复制代码




使用例子:
游客,如果您要查看本帖隐藏内容请回复




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 非常不错,支持分享!另外很美观!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-9 23:25:25 | 显示全部楼层
感谢分享 抽时间看一下
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-10 17:50:40 | 显示全部楼层
看下吧
貌似就用个随机
密码最好绑定下关键函数
只有密码正确关键函数
才能正确解密出来 程序才能跑
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-10 17:51:14 | 显示全部楼层
看下吧
貌似就用个随机
密码最好绑定下关键函数
只有密码正确关键函数
才能正确解密出来 程序才能跑
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-10 21:53:32 | 显示全部楼层
好东东 有本事
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-11 16:09:27 | 显示全部楼层
很不错哦~~!!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-1-16 11:56:44 | 显示全部楼层
楼主分享一下
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2015-12-29 11:53:21 | 显示全部楼层
多谢分享哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-29 13:08:38 | 显示全部楼层
多谢分享!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-30 16:57:43 | 显示全部楼层
:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-12-30 17:09:40 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-3-29 23:07:40 | 显示全部楼层
测试测试测试测试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-30 00:22:17 | 显示全部楼层
谢谢  楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-23 11:15:12 | 显示全部楼层
  楼主 这需要学习什么》?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-23 18:54:40 From FishC Mobile | 显示全部楼层
看看能下载吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-5-26 09:58:47 | 显示全部楼层
谢谢分享
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 05:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表