sankeyou 发表于 2012-1-9 21:20:41

新鲜出炉动态加解密,纯手工打造c++版.

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

动态加解密就是说同样的内容,每次加密的结果都不一样,但是还能解出来
http://bbs.fishc.com/data/attachment/album/201201/09/211602lyd1y7ppp91o9zo5.jpg

例子程序使用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 ^ nRand, 产生一个新的 nKeyTime
    for (i = 0; i < 4; i++)
    {
      ((char*)&nKeyTime) = ((char*) & nStartTime) ^ nRand;
    }

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

      nCount++;
      if (nCount > 3)
      {
            nCount = 0;
      }
    }

    for (i = 0; i < nSrcLen; i++)
    {

      pDst = pSrc;
      // 当前字节先和 key 异或一遍
      for (int j = 0; j < nKeyLen; j++)
      {
            pDst ^= pNewKey;
      }

      // 在和启动时间当前计数异或一遍
      pDst ^= ((char*) & nStartTime);

      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) = pNewSrc;
      ((char *)&nKeyTime2) = pNewSrc ^ 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 ^= ((char *) & nKeyTime);

      nCount++;
      if (nCount > 3)
      {
            nCount = 0;
      }
    }


    for (i = 0; i < nNewSrcLen; i++)
    {
      pDst = pNewSrc ^((char*) & nKeyTime2);

      for (int j = 0; j < nKeyLen; j++)
      {
            pDst ^= pNewKey;
      }

      nCount++;
      if (nCount > 3)
      {
            nCount = 0;
      }

    }

    if (pNewSrc != NULL)
    {
      free(pNewSrc);
      pNewSrc = NULL;
    }

    if (pNewKey != NULL)
    {
      free(pNewKey);
      pNewKey = NULL;
    }

    return nNewSrcLen;
}




使用例子:
**** Hidden Message *****



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

ever.g 发表于 2012-1-9 23:25:25

感谢分享 抽时间看一下

ccqiji 发表于 2012-1-10 17:50:40

看下吧
貌似就用个随机
密码最好绑定下关键函数
只有密码正确关键函数
才能正确解密出来 程序才能跑

ccqiji 发表于 2012-1-10 17:51:14

看下吧
貌似就用个随机
密码最好绑定下关键函数
只有密码正确关键函数
才能正确解密出来 程序才能跑

bafengao 发表于 2012-1-10 21:53:32

好东东 有本事

wqlovt 发表于 2012-1-11 16:09:27

很不错哦~~!!

咴涩丶头像 发表于 2012-1-16 11:56:44

楼主分享一下

ChinaOne 发表于 2015-12-29 11:53:21

多谢分享哦

xiao7 发表于 2015-12-29 13:08:38

多谢分享!

loo 发表于 2015-12-30 16:57:43

:lol:

人造人 发表于 2015-12-30 17:09:40

看看

ybhacker 发表于 2016-3-29 23:07:40

测试测试测试测试

791026701 发表于 2016-3-30 00:22:17

谢谢楼主{:5_109:}

沧桑 发表于 2016-5-23 11:15:12

楼主 这需要学习什么》?

wuhuei153 发表于 2016-5-23 18:54:40

看看能下载吗

zhouxcpython 发表于 2016-5-26 09:58:47

{:5_93:}谢谢分享
页: [1]
查看完整版本: 新鲜出炉动态加解密,纯手工打造c++版.