• 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.
  • 相关阅读:
    mysql创建用户后无法访问数据库的问题
    mysql索引
    hadoop安装
    MySQL工作原理
    MySQL数据库优化的八种方式
    FLOAT 和 DOUBLE区别
    在C++中定义常量
    C++变量类型
    FTP主动模式、被动模式(转)
    FtpClient ReplyCode 意义及 FtpClientHelper辅助类
  • 原文地址:https://www.cnblogs.com/jijm123/p/11297483.html
Copyright © 2020-2023  润新知