鱼C论坛

 找回密码
 立即注册
查看: 10092|回复: 27

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

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

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

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

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

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

                               
登录/注册后可看大图


例子程序使用 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[i] xor rand, 产生一个新的 keyTime
            for i := 0 to sizeof(keyTime) - 1 do
                PByte(@keyTime)[i] := PByte(@keyTime)[i] xor rand;

            // 把 newKeyPtr 和 keyTime 每个字节顺序 xor , 产生一个新的key
            count := 0;
            for i := 0 to keyLength - 1 do
            begin
                newKeyPtr[i] := newKeyPtr[i] xor PByte(@keyTime)[count];
                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[dstposition] := srcPtr[i];

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

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

                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)[i] := (PByte(sourcePtr) + sizeof(rand))[i];
        PByte(@keyTime2)[i] := PByte(@keyTime1)[i] 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[i] := newKeyPtr[i] xor PByte(@keyTime1)[count];
                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[i] := srcPtr[dstposition] xor PByte(@keyTime2)[count];

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

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

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

        except
            Result := 0;
        end;
    finally
        if newKeyPtr <> nil then
            FreeMem(newKeyPtr);
    end;
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-12-22 02:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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