Delphi编写的等长加密与解密

本文分享了一段从C++转换为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.
 
代码中有相关的注释,理解起来应该问题不大。由于写得仓促,难免不足。里面如果有错误,希望大家指出。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值