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.

posted on 2019-08-04 10:44  癫狂编程  阅读(439)  评论(0编辑  收藏  举报

导航

好的代码像粥一样,都是用时间熬出来的