鱼C论坛

 找回密码
 立即注册
查看: 7846|回复: 26

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

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

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

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

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

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

                               
登录/注册后可看大图


例子程序使用 Delphi XE update3 编写, 不保证delphi7可以正常编译(未测试)

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

加密函数:

  1. function Encryption(destinationPtr: Pointer; sourcePtr: Pointer;
  2.   sourceLength: integer;
  3.   strKey: AnsiString = '@#$%^&21P46YV633F4FFBFB871*()_+-='): integer;
  4. var
  5.     keyLength: integer;
  6.     newKeyPtr: PByte;
  7.     startTime: integer;
  8.     keyTime: integer;
  9.     rand: integer;
  10.     i: integer;
  11.     j: integer;
  12.     count: integer;
  13.     dstPtr: PByte;
  14.     srcPtr: PByte;
  15.     dstposition: integer;
  16. begin
  17.     if (destinationPtr = nil) or (sourcePtr = nil) or (sourceLength = 0) then
  18.     begin
  19.         Result := 0;
  20.         Exit;
  21.     end;

  22.     newKeyPtr := nil;

  23.     // key的长度
  24.     keyLength := length(strKey);
  25.     try
  26.         try
  27.             // 内部可修改密匙
  28.             newKeyPtr := AllocMem(keyLength + sizeof(Byte));
  29.             if newKeyPtr = nil then
  30.             begin
  31.                 Result := 0;
  32.                 Exit;
  33.             end;

  34.             // 复制key到新申请的内存中
  35.             CopyMemory(newKeyPtr, PAnsiChar(strKey), keyLength);

  36.             // 启动时间
  37.             startTime := GetTickCount();

  38.             // 密匙时间
  39.             keyTime := startTime;

  40.             // 初始化随机种子并取2-255之间的随机数
  41.             Randomize;
  42.             rand := Random(253) + 2;

  43.             // keyTime 每个字节 = startTime[i] xor rand, 产生一个新的 keyTime
  44.             for i := 0 to sizeof(keyTime) - 1 do
  45.                 PByte(@keyTime)[i] := PByte(@keyTime)[i] xor rand;

  46.             // 把 newKeyPtr 和 keyTime 每个字节顺序 xor , 产生一个新的key
  47.             count := 0;
  48.             for i := 0 to keyLength - 1 do
  49.             begin
  50.                 newKeyPtr[i] := newKeyPtr[i] xor PByte(@keyTime)[count];
  51.                 inc(count);
  52.                 if count > 3 then
  53.                     count := 0;
  54.             end;

  55.             dstPtr := destinationPtr;
  56.             srcPtr := sourcePtr;

  57.             for i := 0 to sourceLength - 1 do
  58.             begin
  59.                 dstposition := sizeof(rand) + sizeof(keyTime) + i;

  60.                 dstPtr[dstposition] := srcPtr[i];

  61.                 // 当前字节先和 key xor 一遍
  62.                 for j := 0 to keyLength - 1 do
  63.                     dstPtr[dstposition] := dstPtr[dstposition] xor newKeyPtr[j];

  64.                 // 再和startTime xor 一遍
  65.                 dstPtr[dstposition] := dstPtr[dstposition]
  66.                   xor PByte(@startTime)[count];

  67.                 inc(count);
  68.                 if count > 3 then
  69.                     count := 0;
  70.             end;

  71.             // not rand 并与 keyTime 进行 xor
  72.             rand := not rand;
  73.             rand := rand xor keyTime;

  74.             // 将rand 和 keyTime 分别写入前(sizeof(rand) + sizeof(keyTime))个字节中
  75.             PInteger(dstPtr)^ := rand;
  76.             PInteger(dstPtr + sizeof(rand))^ := keyTime;

  77.             // 返回加密后的长度
  78.             Result := sourceLength + sizeof(rand) + sizeof(keyTime);

  79.         except
  80.             Result := 0;
  81.         end;
  82.     finally
  83.         if newKeyPtr <> nil then
  84.             FreeMem(newKeyPtr);
  85.     end;
  86. end;
复制代码
解密函数:

  1. function Decryption(destinationPtr: Pointer; sourcePtr: Pointer;
  2.   sourceLength: integer;
  3.   strKey: AnsiString = '@#$%^&21P46YV633F4FFBFB871*()_+-='): integer;
  4. var
  5.     keyLength: integer;
  6.     newKeyPtr: PByte;
  7.     keyTime1: integer;
  8.     keyTime2: integer;
  9.     rand: integer;
  10.     i: integer;
  11.     j: integer;
  12.     count: integer;
  13.     dstPtr: PByte;
  14.     srcPtr: PByte;
  15.     dstposition: integer;
  16. begin
  17.     if (destinationPtr = nil) or (sourcePtr = nil) or (sourceLength < 9) then
  18.     begin
  19.         Result := 0;
  20.         Exit;
  21.     end;

  22.     newKeyPtr := nil;

  23.     // key的长度
  24.     keyLength := length(strKey);

  25.     // 取出那个随机数
  26.     rand := PInteger(sourcePtr)
  27.       ^ xor (PInteger(integer(sourcePtr) + sizeof(rand)))^;
  28.     rand := not rand;

  29.     for i := 0 to sizeof(keyTime2) - 1 do
  30.     begin
  31.         PByte(@keyTime1)[i] := (PByte(sourcePtr) + sizeof(rand))[i];
  32.         PByte(@keyTime2)[i] := PByte(@keyTime1)[i] xor rand;
  33.     end;

  34.     try
  35.         try
  36.             // 内部可修改密匙
  37.             newKeyPtr := AllocMem(keyLength + sizeof(Byte));
  38.             if newKeyPtr = nil then
  39.             begin
  40.                 Result := 0;
  41.                 Exit;
  42.             end;

  43.             // 复制key到新申请的内存中
  44.             CopyMemory(newKeyPtr, PAnsiChar(strKey), keyLength);

  45.             // 把 newKeyPtr 和 keyTime 每个字节顺序 xor , 还原原始的key
  46.             count := 0;
  47.             for i := 0 to keyLength - 1 do
  48.             begin
  49.                 newKeyPtr[i] := newKeyPtr[i] xor PByte(@keyTime1)[count];
  50.                 inc(count);
  51.                 if count > 3 then
  52.                     count := 0;
  53.             end;

  54.             dstPtr := destinationPtr;
  55.             srcPtr := sourcePtr;
  56.             sourceLength := sourceLength - (sizeof(rand) + sizeof(keyTime1));
  57.             for i := 0 to sourceLength - 1 do
  58.             begin
  59.                 dstposition := sizeof(rand) + sizeof(keyTime1) + i;
  60.                 dstPtr[i] := srcPtr[dstposition] xor PByte(@keyTime2)[count];

  61.                 // 当前字节先和 key xor 一遍
  62.                 for j := 0 to keyLength - 1 do
  63.                     dstPtr[i] := dstPtr[i] xor newKeyPtr[j];

  64.                 inc(count);
  65.                 if count > 3 then
  66.                     count := 0;
  67.             end;

  68.             // 返回加密后的长度
  69.             Result := sourceLength;

  70.         except
  71.             Result := 0;
  72.         end;
  73.     finally
  74.         if newKeyPtr <> nil then
  75.             FreeMem(newKeyPtr);
  76.     end;
  77. end;
复制代码
有例子下载
游客,如果您要查看本帖隐藏内容请回复




PS:加解密的执行效率,取决于Key的长度,key越长就越慢,不可不免,但是这2个函数,效率依然很高,key长一些就相对安全一些.
PS:加密后存储的buffer要比加密前的大8个字节,解密后的buffer比解密前的可以小8个字节.

C++版本连接: http://bbs.fishc.com/forum.php?mod=viewthread&tid=12974&page=1&extra=#pid124384
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-10 08:31:51 | 显示全部楼层
学习一下,有提供源码吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-10 08:37:18 | 显示全部楼层
虽然不是太懂,但好贴必须要顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-1-10 17:57:25 | 显示全部楼层
需要学习的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-13 17:47:40 | 显示全部楼层
看看嘛。。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-7-2 21:52:27 | 显示全部楼层
看帖,回复支持下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-8 17:06:50 | 显示全部楼层
感谢楼主分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-11 08:38:57 From FishC Mobile | 显示全部楼层
雁过留声,人过留影。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-12 18:32:32 | 显示全部楼层
嗯  学习下啊  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-12 21:23:46 | 显示全部楼层
不错不错 我喜欢(*^__^*) 嘻嘻……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-22 07:35:18 | 显示全部楼层
好东西学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-23 08:57:14 | 显示全部楼层
谢谢楼主无私奉献
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-19 20:08:25 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-19 20:33:12 | 显示全部楼层
厉害  ,谢谢分享 好好研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-10-20 08:00:02 | 显示全部楼层
下载学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-29 11:52:49 | 显示全部楼层
多谢分享哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-30 16:59:04 | 显示全部楼层
:victory:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-1-27 17:07:10 | 显示全部楼层
下载了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-11 13:38:26 | 显示全部楼层
我正好需要,就拿走了。谢谢老大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-2 22:19:45 | 显示全部楼层
谢谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 06:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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