最近在看一本关于网络游戏服务端开发的书,虽然该书是个空架子,里面没有多少实际的内容(此书评价不好),但其中关于等长加密与解密的代码还是有一定的借鉴作用的。他山之石,可以攻玉。因为书中是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.

Delphi编写的等长加密与解密的更多相关文章

  1. [Swift通天遁地]七、数据与安全-(17)使用Swift实现原生的3DES加密和解密

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. OD学习笔记10:一个VB程序的加密和解密思路

    前边,我们的例子中既有VC++开发的程序,也有Delphi开发的程序,今天我们给大家分析一个VB程序的加密和解密思路. Virtual BASIC是由早期DOS时代的BASIC语言发展而来的可视化编程 ...

  3. 分享一次C#调用Delphi编写Dll程序

    1.前言: 最近接手了一个项目需要和Delphi语言编写的一个系统进行一些接口的对接,数据在传输过程中采用Des加密方式,因为Delphi 平台的加密方式和C#平台的加密方式不互通,所以采用的方式是C ...

  4. C# 网络加密与解密

    数据在网络传输过程中的保密性是网络安全中重点要考虑的问题之一.由于通过网络传递数据是在不安全的信道上进行传输的,因此通信双方要想确保任何可能正在侦听的人无法理解通信的内容,而且希望确保接收方接收的信息 ...

  5. 关于《加密与解密》的读后感----对dump脱壳的一点思考

    偶然翻了一下手机日历,原来今天是夏至啊,时间过的真快.ISCC的比赛已经持续了2个多月了,我也跟着比赛的那些题目学了2个月.......虽然过程很辛苦,但感觉还是很幸运的,能在大三的时候遇到ISCC, ...

  6. Java实现文件的加密与解密

    最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...

  7. Java Base64加密、解密原理Java代码

    Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...

  8. JS URL 使用base64加密与解密

    JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...

  9. 基于私钥加密公钥解密的RSA算法C#实现

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

随机推荐

  1. MAC 环境下搭建HttpRunnerManager平台

    1 . mac pycharm 创建虚拟环境 https://blog.csdn.net/qq_39806105/article/details/96908584 2. mac 环境下搭建HttpRu ...

  2. percona-toolkit主从同步整理(MySQL)

    前言:MYSQL主从同步架构是目前使用最多的数据库架构之一,尤其是负载比较大的网站,因此对于主从同步的管理也就显得非常重要.而数据作为软件的核心部分,对于其有效的管理显得更为重要.随着时间的推移,软件 ...

  3. R的数据结构--数组

    数组:可以认为数组是矩阵的扩展,它将矩阵扩展到2维以上.如果给定的数组是1维的则相当于向量,2维的相当于矩阵. R语言中的数组元素的类型也是单一的,可以是数值型,逻辑型,字符型或复数型 参数解释 ar ...

  4. 【洛谷P2485】计算器

    BSGS模板题 代码如下 #include <bits/stdc++.h> using namespace std; typedef long long LL; LL fpow(LL a, ...

  5. glRenderbufferStorageMultisample

    https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glRenderbufferStorage.xhtml https://www. ...

  6. 3-cmd命令

    1.查看IPC$是否启用 命令:net share 2.启动/停止windows服务 命令:net start MSDTC     net stop MSDTC 3.修改服务的启动类型(start=  ...

  7. springboot2.0入门(一)----springboot 简介

    一.springboot解决了什么? 避免了繁杂的xml配置,框架自动帮我们完成了相关的配置,当我们需要进行相关插件集成的时候,只需要将相关的starter通过相关的maven依赖引进,并可以进行相关 ...

  8. 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理

    1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...

  9. 配置NFS共享

    NFS(网络文件系统)-------> linux与linux平台 服务器端: 1.安装软件nfs-utils(服务:nfs-server) 2.创建共享目录:mkdir /nfs_dir 3. ...

  10. 用php把excel数据导入数据库

    PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel. 先下载PHPExcel类库· 读取文件源码: <?php header(&q ...