sankeyou 发表于 2012-1-9 17:55:22

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

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

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

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

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

加密函数:
function Encryption(destinationPtr: Pointer; sourcePtr: Pointer;
sourceLength: integer;
strKey: AnsiString = '@#$%^&21P46YV633F4FFBFB871*()_+-='): integer;
var
    keyLength: integer;
    newKeyPtr: PByte;
    startTime: integer;
    keyTime: integer;
    rand: integer;
    i: integer;
    j: integer;
    count: integer;
    dstPtr: PByte;
    srcPtr: PByte;
    dstposition: integer;
begin
    if (destinationPtr = nil) or (sourcePtr = nil) or (sourceLength = 0) then
    begin
      Result := 0;
      Exit;
    end;

    newKeyPtr := nil;

    // key的长度
    keyLength := length(strKey);
    try
      try
            // 内部可修改密匙
            newKeyPtr := AllocMem(keyLength + sizeof(Byte));
            if newKeyPtr = nil then
            begin
                Result := 0;
                Exit;
            end;

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

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

            // 密匙时间
            keyTime := startTime;

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

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

            // 把 newKeyPtr 和 keyTime 每个字节顺序 xor , 产生一个新的key
            count := 0;
            for i := 0 to keyLength - 1 do
            begin
                newKeyPtr := newKeyPtr xor PByte(@keyTime);
                inc(count);
                if count > 3 then
                  count := 0;
            end;

            dstPtr := destinationPtr;
            srcPtr := sourcePtr;

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

                dstPtr := srcPtr;

                // 当前字节先和 key xor 一遍
                for j := 0 to keyLength - 1 do
                  dstPtr := dstPtr xor newKeyPtr;

                // 再和startTime xor 一遍
                dstPtr := dstPtr
                  xor PByte(@startTime);

                inc(count);
                if count > 3 then
                  count := 0;
            end;

            // not rand 并与 keyTime 进行 xor
            rand := not rand;
            rand := rand xor keyTime;

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

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

      except
            Result := 0;
      end;
    finally
      if newKeyPtr <> nil then
            FreeMem(newKeyPtr);
    end;
end;解密函数:
function Decryption(destinationPtr: Pointer; sourcePtr: Pointer;
sourceLength: integer;
strKey: AnsiString = '@#$%^&21P46YV633F4FFBFB871*()_+-='): integer;
var
    keyLength: integer;
    newKeyPtr: PByte;
    keyTime1: integer;
    keyTime2: integer;
    rand: integer;
    i: integer;
    j: integer;
    count: integer;
    dstPtr: PByte;
    srcPtr: PByte;
    dstposition: integer;
begin
    if (destinationPtr = nil) or (sourcePtr = nil) or (sourceLength < 9) then
    begin
      Result := 0;
      Exit;
    end;

    newKeyPtr := nil;

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

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

    for i := 0 to sizeof(keyTime2) - 1 do
    begin
      PByte(@keyTime1) := (PByte(sourcePtr) + sizeof(rand));
      PByte(@keyTime2) := PByte(@keyTime1) xor rand;
    end;

    try
      try
            // 内部可修改密匙
            newKeyPtr := AllocMem(keyLength + sizeof(Byte));
            if newKeyPtr = nil then
            begin
                Result := 0;
                Exit;
            end;

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

            // 把 newKeyPtr 和 keyTime 每个字节顺序 xor , 还原原始的key
            count := 0;
            for i := 0 to keyLength - 1 do
            begin
                newKeyPtr := newKeyPtr xor PByte(@keyTime1);
                inc(count);
                if count > 3 then
                  count := 0;
            end;

            dstPtr := destinationPtr;
            srcPtr := sourcePtr;
            sourceLength := sourceLength - (sizeof(rand) + sizeof(keyTime1));
            for i := 0 to sourceLength - 1 do
            begin
                dstposition := sizeof(rand) + sizeof(keyTime1) + i;
                dstPtr := srcPtr xor PByte(@keyTime2);

                // 当前字节先和 key xor 一遍
                for j := 0 to keyLength - 1 do
                  dstPtr := dstPtr xor newKeyPtr;

                inc(count);
                if count > 3 then
                  count := 0;
            end;

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

      except
            Result := 0;
      end;
    finally
      if newKeyPtr <> nil then
            FreeMem(newKeyPtr);
    end;
end;有例子下载
**** Hidden Message *****



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

arron 发表于 2012-1-10 08:31:51

学习一下,有提供源码吗???

絮飞 发表于 2012-1-10 08:37:18

虽然不是太懂,但好贴必须要顶

笑浪 发表于 2012-1-10 17:57:25

需要学习的

跑跑卡丁车 发表于 2013-1-13 17:47:40

看看嘛。。。。。。。

我挖 发表于 2013-7-2 21:52:27

看帖,回复支持下

shenlw66 发表于 2013-8-8 17:06:50

感谢楼主分享!

jack99699 发表于 2013-8-11 08:38:57

雁过留声,人过留影。

cycy07 发表于 2013-8-12 18:32:32

嗯学习下啊

牡丹花下死做鬼 发表于 2013-8-12 21:23:46

不错不错 我喜欢(*^__^*) 嘻嘻……

远夏 发表于 2014-8-22 07:35:18

好东西学习一下

cable5881 发表于 2014-8-23 08:57:14

谢谢楼主无私奉献

张紫叶 发表于 2014-10-19 20:08:25

支持

qq351317878 发表于 2014-10-19 20:33:12

厉害,谢谢分享 好好研究

tlwangxd 发表于 2014-10-20 08:00:02

下载学习

ChinaOne 发表于 2015-12-29 11:52:49

多谢分享哦

loo 发表于 2015-12-30 16:59:04

:victory:

shenlan7788 发表于 2016-1-27 17:07:10

下载了,谢谢

yshejia 发表于 2016-6-11 13:38:26

我正好需要,就拿走了。谢谢老大

ELI_ 发表于 2016-7-2 22:19:45

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