zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    QT正则表达式
    unix网络编程笔记
    网页书签
    trie tree(字典树)
    C++网络爬虫抓取图片
    网络编程——客户端简单流程
    OpenCV系列--摄像头控制的简单代码
    订单号生成雪花算法
    docker 运行tomcat项目
    docker 打包springboot镜像并启动
  • 原文地址:https://www.cnblogs.com/jijm123/p/11297483.html
Copyright © 2011-2022 走看看