Delphi编写的等长加密与解密

简介:
最近在看一本关于网络游戏服务端开发的书,虽然该书是个空架子,里面没有多少实际的内容(此书评价不好),但其中关于等长加密与解密的代码还是有一定的借鉴作用的。他山之石,可以攻玉。因为书中是C++的代码,所以我花了半个小时的时间将它转换成了Delphi的代码。公布出来便于有这方面需要的朋友可以借鉴使用。
 
{
加解密单元
作者:张超
}
unit uCrypt;
interface
uses
  Windows, SysUtils;
const
  C1        = 52845;
  C2        = 22719;
  CryptKey  = 72957;
  function  Encrypt(Source: array of Byte; var Dest: array of Byte; Len: Cardinal): BOOL; overload;
  function  Decrypt(Source: array of Byte; var Dest: array of Byte; Len: Cardinal): BOOL; overload;
  function  Encrypt(Source: String; var Dest: string): BOOL; overload;
  function  Decrypt(Source: String; var Dest: string): BOOL; overload;
  function  Encrypt(Source: Pchar; Dest: PChar; Len: Cardinal): BOOL; overload;
  function  Decrypt(Source: Pchar; Dest: PChar; Len: Cardinal): BOOL; overload;

implementation
function  Encrypt(Source: Pchar; Dest: PChar; Len: Cardinal): BOOL; overload;
var
  i: Integer;
  Key: Integer;
begin
  Key:=CryptKey;
  //判断数据是否正常
  if (not Assigned(Source)) or (not Assigned(Dest)) or (Len <=0) then
  begin
    Result:=False;
    Exit;
  end;
  //循环加密每一个字节
  for i:=0 to Len - 1 do
  begin
    Dest[i]:=Char(Byte(Source[i]) xor (Key shr 8));
    Key:=(Byte(Dest[i]) + Key) * C1 + C2;
  end;
  Result:=True;
end;
function  Decrypt(Source: Pchar; Dest: PChar; Len: Cardinal): BOOL; overload;
var
  i: Integer;
  Key: Integer;
  PrevBlock: Byte;
begin
  Key:=CryptKey;
  //判断数据是否正常
  if (not Assigned(Source)) or (not Assigned(Dest)) or (Len <=0) then
  begin
    Result:=False;
    Exit;
  end;
  //循环加密每一个字节
  for i:=0 to Len - 1 do
  begin
    PrevBlock:=Byte(Source[i]);
    Dest[i]:=Char(Byte(Source[i]) xor (Key shr 8));
    Key:=(Byte(PrevBlock) + Key) * C1 + C2;
  end;
  Result:=True;
end;
function  Encrypt(Source: String; var Dest: string): BOOL;
begin
  Result:=False;
  if Length(Source) > 0 then
  begin
    SetLength(Dest, Length(Source));
    Encrypt(PChar(Source), PChar(Dest), Length(Source));
    Result:=True;
  end;
end;
function  Decrypt(Source: String; var Dest: string): BOOL;
begin
  Result:=False;
  if Length(Source) > 0 then
  begin
    SetLength(Dest, Length(Source));
    Decrypt(PChar(Source), PChar(Dest), Length(Source));
    Result:=True;
  end;
end;
function  Encrypt(Source: array of Byte; var Dest: array of Byte; Len: Cardinal): BOOL;
var
  i: Integer;
  Key: Integer;
begin
  Key:=CryptKey;
  //判断数据是否正常
  if Len <= 0 then
  begin
    Result:=False;
    Exit;
  end;
  //循环加密每一个字节
  for i:=0 to Len - 1 do
  begin
    Dest[i]:=Source[i] xor (Key shr 8);
    Key:=(Dest[i] + Key) * C1 + C2;
  end;
  Result:=True;
end;
function  Decrypt(Source: array of Byte; var Dest: array of Byte; Len: Cardinal): BOOL;
var
  i: Integer;
  PrevBlock: Byte;
  Key: Integer;
begin
  Key:=CryptKey;
  //判断数据是否正常
  if (Len <= 0) then
  begin
    Result:=False;
    Exit;
  end;
  //循环解密每一个字节
  for i:=0 to Len - 1 do
  begin
    PrevBlock:=Source[i];
    Dest[i]:=Source[i] xor (Key shr 8);
    Key:=(PrevBlock + Key) * C1 + C2;
  end;
  Result:=True;
end;

end.
 
代码中有相关的注释,理解起来应该问题不大。由于写得仓促,难免不足。里面如果有错误,希望大家指出。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/337456如需转载请自行联系原作者

fxh7622
相关文章
|
算法 程序员 数据安全/隐私保护
【Python】编写代码,实现恺撒密码的加密算法以及欧氏距离程序
在本次python文章种,编写此函数的目的,主要是为了理解和掌握自定义函数过程的定义和调用方法,以及函数中的参数的作用,本次定义的函数是恺撒密码加解密算法
129 0
|
数据安全/隐私保护 C语言 C++
【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )
【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )
498 0
|
数据安全/隐私保护
[re入门]一个简单的加密程序的逆向破解与解密
[re入门]一个简单的加密程序的逆向破解与解密
229 0
[re入门]一个简单的加密程序的逆向破解与解密
|
开发工具 数据安全/隐私保护
混淆和加密.NET开发工具
.NET开发的工具,可以用ILSpy等很轻松的反编译查看源码,为了保护自己写的软件,一般会对软件进行加密,不仅内部关键数据通过加密,软件开发完毕后,对软件也进行加密,防止别人很轻松的反编译和查看到比较重要的数据,我试了下Reactor混淆和加密后的dll和exe,用它很简单的混淆和加密文件后,它们不会被很轻易的破解和查看源码了。
904 0
|
安全 API 数据安全/隐私保护
Unity3D代码加密防止反编译及资源加密
代码加密,防止反编译 Virbox Protector加壳工具 利用加壳工具可对Unity3D开发的软件进行加壳保护,主要保护方式:碎片代码、混淆、虚拟化。适用于快速加密方案,不需要编写任何代码,通过设置工具提供选项完成软件加壳保护,方便快捷。
2404 0
|
数据安全/隐私保护
|
数据安全/隐私保护 开发工具 IDE
|
数据安全/隐私保护