新鲜出炉动态加解密,纯手工打造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
学习一下,有提供源码吗??? 虽然不是太懂,但好贴必须要顶 需要学习的 看看嘛。。。。。。。 看帖,回复支持下 感谢楼主分享! 雁过留声,人过留影。 嗯学习下啊 不错不错 我喜欢(*^__^*) 嘻嘻…… 好东西学习一下 谢谢楼主无私奉献 支持 厉害,谢谢分享 好好研究 下载学习 多谢分享哦 :victory: 下载了,谢谢 我正好需要,就拿走了。谢谢老大 谢谢分享{:10_257:}
页:
[1]
2