(**************************************************************)

(*Advanced Encryption Standard (AES)*)

(*Interface Unit v1.3*)

(* *)

(*Copyright (c) 2002 Jorlen Young*)

(* *)

(*说明:*)

(*基于 ElASE.pas 单元封装*)

(* *)

(*这是一个 AES 加密算法的标准接口。*)

(*调用示例:*)

(*if not EncryptStream(src, key, TStream(Dest), keybit) then*)

(*showmessage('encrypt error');*)

(* *)

(*if not DecryptStream(src, key, TStream(Dest), keybit) then*)

(*showmessage('encrypt error');*)

(* *)

(**** 一定要对Dest进行TStream(Dest) ****)

(*==========================================================*)

(* *)

(*支持 128 / 192 / 256 位的密匙*)

(*默认情况下按照 128 位密匙操作*)

(* *)

(**************************************************************)

unitAES;interface

{$IFDEF VER210}

{$WARN IMPLICIT_STRING_CAST OFF} //关闭警告

{$WARN IMPLICIT_STRING_CAST_LOSS OFF}

{$ENDIF}

usesSysUtils, Classes, Math, ElAES;constSDestStreamNotCreated= 'Dest stream not created.';

SEncryptStreamError= 'Encrypt stream error.';

SDecryptStreamError= 'Decrypt stream error.';typeTKeyBit=(kb128, kb192, kb256);functionStrToHex(Const str: AnsiString): AnsiString;function HexToStr(constStr: AnsiString): AnsiString;functionEncryptString(Value: AnsiString; Key: AnsiString;

KeyBit: TKeyBit=kb128): AnsiString;functionDecryptString(Value: AnsiString; Key: AnsiString;

KeyBit: TKeyBit=kb128): AnsiString;functionEncryptStream(Src: TStream; Key: AnsiString;var Dest: TStream; KeyBit: TKeyBit =kb128): Boolean;functionDecryptStream(Src: TStream; Key: AnsiString;var Dest: TStream; KeyBit: TKeyBit =kb128): Boolean;procedureEncryptFile(SourceFile, DestFile: String;

Key: AnsiString; KeyBit: TKeyBit=kb128);procedureDecryptFile(SourceFile, DestFile: String;

Key: AnsiString; KeyBit: TKeyBit=kb128);implementation

functionStrToHex(Const str: Ansistring): Ansistring;asmpush ebx

push esi

push edi

test eax,eax

jz @@Exit

mov esi,edx//保存edx值,用来产生新字符串的地址

mov edi,eax //保存原字符串

mov edx,[eax-4] //获得字符串长度

test edx,edx //检查长度

je @@Exit {Length(S) = 0}mov ecx,edx//保存长度

Push ecxshl edx,1mov eax,esi{$IFDEF VER210}movzx ecx, word ptr [edi-12] {需要设置CodePage}

{$ENDIF}call System.@LStrSetLength//设置新串长度

mov eax,esi //新字符串地址

Call UniqueString //产生一个唯一的新字符串,串位置在eax中

Pop ecx

@@SetHex:xor edx,edx //清空edx

mov dl, [edi] //Str字符串字符

mov ebx,edx //保存当前的字符

shr edx,4 //右移4字节,得到高8位

mov dl,byte ptr[edx+@@HexChar] //转换成字符

mov [eax],dl //将字符串输入到新建串中存放

and ebx,$0F //获得低8位

mov dl,byte ptr[ebx+@@HexChar] //转换成字符

inc eax //移动一个字节,存放低位

mov [eax],dl

inc edi

inc eax

loop @@SetHex

@@Exit:

pop edi

pop esi

pop ebx

ret

@@HexChar: db'0123456789ABCDEF'

end;function HexToStr(constStr: AnsiString): AnsiString;asmpush ebx

push edi

push esi

test eax,eax//为空串

jz @@Exit

mov edi,eax

mov esi,edx

mov edx,[eax-4]

test edx,edx

je @@Exit

mov ecx,edx

push ecxshr edx,1mov eax,esi//开始构造字符串

{$IFDEF VER210}movzx ecx, word ptr [edi-12] {需要设置CodePage}

{$ENDIF}call System.@LStrSetLength//设置新串长度

mov eax,esi //新字符串地址

Call UniqueString //产生一个唯一的新字符串,串位置在eax中

Pop ecxxorebx,ebxxoresi,esi

@@CharFromHex:xoredx,edx

mov dl, [edi]//Str字符串字符

cmp dl, '0' //查看是否在0到f之间的字符

JB @@Exit //小于0,退出

cmp dl,'9' //小于=9

ja @@DoChar//CompOkNum

sub dl,'0'jmp @@DoConvert

@@DoChar://先转成大写字符

anddl,$DF

cmp dl,'F'ja @@Exit//大于F退出

add dl,10sub dl,'A'@@DoConvert://转化

inc ebx

cmp ebx,2je @@Num1xoresi,esishl edx,4mov esi,edx

jmp @@Num2

@@Num1:

add esi,edx

mov edx,esi

mov [eax],dlxorebx,ebx

inc eax

@@Num2:

dec ecx

inc edi

test ecx,ecx

jnz @@CharFromHex

@@Exit:

pop esi

pop edi

pop ebxend;{-- 字符串加密函数 默认按照 128 位密匙加密 --}

functionEncryptString(Value: AnsiString; Key: AnsiString;

KeyBit: TKeyBit=kb128): AnsiString;var

{$IFDEF VER210}SS,DS: TMemoryStream;{$ELSE}SS, DS: TStringStream;{$ENDIF}Size: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;

st: AnsiString;beginResult := '';{$IFDEF VER210}ss := TMemoryStream.Create;

SS.WriteBuffer(PAnsiChar(Value)^,Length(Value));

DS := TMemoryStream.Create;{$ELSE}SS := TStringStream.Create(Value);

DS := TStringStream.Create('');{$ENDIF}

trySize :=SS.Size;

DS.WriteBuffer(Size, SizeOf(Size));{-- 128 位密匙最大长度为 16 个字符 --}

if KeyBit = kb128 then

beginFillChar(AESKey128, SizeOf(AESKey128),0);

Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));

EncryptAESStreamECB(SS,0, AESKey128, DS);end;{-- 192 位密匙最大长度为 24 个字符 --}

if KeyBit = kb192 then

beginFillChar(AESKey192, SizeOf(AESKey192),0);

Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));

EncryptAESStreamECB(SS,0, AESKey192, DS);end;{-- 256 位密匙最大长度为 32 个字符 --}

if KeyBit = kb256 then

beginFillChar(AESKey256, SizeOf(AESKey256),0);

Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));

EncryptAESStreamECB(SS,0, AESKey256, DS);end;{$IFDEF VER210}SetLength(st,Ds.Size);

DS.Position := 0;

DS.ReadBuffer(PAnsiChar(st)^,DS.Size);

Result :=StrToHex(st);{$ELSE}Result :=StrToHex(DS.DataString);{$ENDIF}

finallySS.Free;

DS.Free;end;end;{-- 字符串解密函数 默认按照 128 位密匙解密 --}

functionDecryptString(Value: AnsiString; Key: AnsiString;

KeyBit: TKeyBit=kb128): AnsiString;varSS, DS: TStringStream;

Size: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;beginResult := '';

SS := TStringStream.Create(HexToStr(Value));

DS := TStringStream.Create('');trySize :=SS.Size;

SS.ReadBuffer(Size, SizeOf(Size));{-- 128 位密匙最大长度为 16 个字符 --}

if KeyBit = kb128 then

beginFillChar(AESKey128, SizeOf(AESKey128),0);

Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));

DecryptAESStreamECB(SS, SS.Size-SS.Position, AESKey128, DS);end;{-- 192 位密匙最大长度为 24 个字符 --}

if KeyBit = kb192 then

beginFillChar(AESKey192, SizeOf(AESKey192),0);

Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));

DecryptAESStreamECB(SS, SS.Size-SS.Position, AESKey192, DS);end;{-- 256 位密匙最大长度为 32 个字符 --}

if KeyBit = kb256 then

beginFillChar(AESKey256, SizeOf(AESKey256),0);

Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));

DecryptAESStreamECB(SS, SS.Size-SS.Position, AESKey256, DS);end;

Result :=DS.DataString;finallySS.Free;

DS.Free;end;end;{流加密函数, default keybit: 128bit}

functionEncryptStream(Src: TStream; Key: AnsiString;var Dest: TStream; KeyBit: TKeyBit =kb128): Boolean;varCount: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;begin

if Dest = nil then

begin

raise Exception.Create(SDestStreamNotCreated);

Result:=False;

Exit;end;trySrc.Position:= 0;

Count:=Src.Size;

Dest.Write(Count, SizeOf(Count));{-- 128 位密匙最大长度为 16 个字符 --}

if KeyBit = kb128 then

beginFillChar(AESKey128, SizeOf(AESKey128),0);

Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));

EncryptAESStreamECB(Src,0, AESKey128, Dest);end;{-- 192 位密匙最大长度为 24 个字符 --}

if KeyBit = kb192 then

beginFillChar(AESKey192, SizeOf(AESKey192),0);

Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));

EncryptAESStreamECB(Src,0, AESKey192, Dest);end;{-- 256 位密匙最大长度为 32 个字符 --}

if KeyBit = kb256 then

beginFillChar(AESKey256, SizeOf(AESKey256),0);

Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));

EncryptAESStreamECB(Src,0, AESKey256, Dest);end;

Result :=True;except

raise Exception.Create(SEncryptStreamError);

Result:=False;end;end;{流解密函数, default keybit: 128bit}

functionDecryptStream(Src: TStream; Key: AnsiString;var Dest: TStream; KeyBit: TKeyBit =kb128): Boolean;varCount, OutPos: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;begin

if Dest = nil then

begin

raise Exception.Create(SDestStreamNotCreated);

Result:=False;

Exit;end;trySrc.Position:= 0;

OutPos:=Dest.Position;

Src.ReadBuffer(Count, SizeOf(Count));{-- 128 位密匙最大长度为 16 个字符 --}

if KeyBit = kb128 then

beginFillChar(AESKey128, SizeOf(AESKey128),0);

Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));

DecryptAESStreamECB(Src, Src.Size-Src.Position,

AESKey128, Dest);end;{-- 192 位密匙最大长度为 24 个字符 --}

if KeyBit = kb192 then

beginFillChar(AESKey192, SizeOf(AESKey192),0);

Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));

DecryptAESStreamECB(Src, Src.Size-Src.Position,

AESKey192, Dest);end;{-- 256 位密匙最大长度为 32 个字符 --}

if KeyBit = kb256 then

beginFillChar(AESKey256, SizeOf(AESKey256),0);

Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));

DecryptAESStreamECB(Src, Src.Size-Src.Position,

AESKey256, Dest);end;

Dest.Size := OutPos +Count;

Dest.Position :=OutPos;

Result :=True;except

raise Exception.Create(SDecryptStreamError);

Result:=False;end;end;{-- 文件加密函数 默认按照 128 位密匙解密 --}

procedureEncryptFile(SourceFile, DestFile: String;

Key: AnsiString; KeyBit: TKeyBit=kb128);varSFS, DFS: TFileStream;

Size: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;beginSFS := TFileStream.Create(SourceFile, fmOpenRead);tryDFS := TFileStream.Create(DestFile, fmCreate);trySize :=SFS.Size;

DFS.WriteBuffer(Size, SizeOf(Size));{-- 128 位密匙最大长度为 16 个字符 --}

if KeyBit = kb128 then

beginFillChar(AESKey128, SizeOf(AESKey128),0);

Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));

EncryptAESStreamECB(SFS,0, AESKey128, DFS);end;{-- 192 位密匙最大长度为 24 个字符 --}

if KeyBit = kb192 then

beginFillChar(AESKey192, SizeOf(AESKey192),0);

Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));

EncryptAESStreamECB(SFS,0, AESKey192, DFS);end;{-- 256 位密匙最大长度为 32 个字符 --}

if KeyBit = kb256 then

beginFillChar(AESKey256, SizeOf(AESKey256),0);

Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));

EncryptAESStreamECB(SFS,0, AESKey256, DFS);end;finallyDFS.Free;end;finallySFS.Free;end;end;{-- 文件解密函数 默认按照 128 位密匙解密 --}

procedureDecryptFile(SourceFile, DestFile: String;

Key: AnsiString; KeyBit: TKeyBit=kb128);varSFS, DFS: TFileStream;

Size: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;beginSFS := TFileStream.Create(SourceFile, fmOpenRead);trySFS.ReadBuffer(Size, SizeOf(Size));

DFS := TFileStream.Create(DestFile, fmCreate);try

{-- 128 位密匙最大长度为 16 个字符 --}

if KeyBit = kb128 then

beginFillChar(AESKey128, SizeOf(AESKey128),0);

Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));

DecryptAESStreamECB(SFS, SFS.Size-SFS.Position, AESKey128, DFS);end;{-- 192 位密匙最大长度为 24 个字符 --}

if KeyBit = kb192 then

beginFillChar(AESKey192, SizeOf(AESKey192),0);

Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));

DecryptAESStreamECB(SFS, SFS.Size-SFS.Position, AESKey192, DFS);end;{-- 256 位密匙最大长度为 32 个字符 --}

if KeyBit = kb256 then

beginFillChar(AESKey256, SizeOf(AESKey256),0);

Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));

DecryptAESStreamECB(SFS, SFS.Size-SFS.Position, AESKey256, DFS);end;

DFS.Size :=Size;finallyDFS.Free;end;finallySFS.Free;end;end;end.

delphi mysql.pas_Delphi 一些pas相关推荐

  1. 如何去掉Delphi自动生成的~.pas等临时文件

    如何去掉Delphi自动生成的~.pas等临时文件 一.Delphi7 二.Delphi2010 转载于:https://www.cnblogs.com/m0488/archive/2013/05/2 ...

  2. delphi mysql.pas_mysql_pas DELPHI的 连接类源码,附带例程,无需ODBC驱动! VCL 269万源代码下载- www.pudn.com...

    文件名称: mysql_pas下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Delphi 文件大小: 1482 KB 上传时间: 2015-08-10 下载次数: 16 提 供 者 ...

  3. delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...

    先用php+mysql将文件通过web方式保存到远程的服务器的blob字段中,然后用 delphi+libmysql.dll直接连接远程MySql数据库,再将数据复制到本地的MySql数据库中. 代码 ...

  4. delphi mysql 三层_Delphi XE 10 跨平台三层数据库应用 datasnap

    (1)生成DataSnap服务器的框架 初学者都是呆子,还是用向导吧,主菜单"File"->"New"->"Other-"得到& ...

  5. delphi mysql 乱码_Delphi连接mysql中文乱码的解决办法

    MySQL数据库不常使用,以往使用都是连接已有的数据库,从未出现乱码问题.这次做到演示版的程序,需要自己建立MySQL数据库,而使用Delphi连接时,凡是数据库中文内容都显示为"???&q ...

  6. delphi mysql 图片_delphi数据库图片的存取 【转】

    一. 原理介绍--流式数据的类型及其应用 在Dephi中提供了TStream来支持对流式数据的操作.TStream是万流之源. 但由于它是一个抽象类,故不能被直接使用:而要使用其相应的子类, 如:TF ...

  7. delphi mysql 删除_Delphi 用SQL语句添加删除修改字段

    1.增加字段 alter table docdsp     add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP COLUMN column ...

  8. delphi mysql 图片_Delphi实现在数据库中存取图像

    本实例演示如何在数据库中存取图像文件. 向窗体上添加一个TListBox组件.一个TImage组件和一个TTable组件,设计完成的主界面. 本系统中需要设计一个新的基于Paradox 7的数据库Im ...

  9. 基于Delphi+MySQL的大学生竞赛发布及组队系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/86794871 资源下载地址:https://download.csdn.net/downl ...

  10. Delphi对象池MyObjectPool.pas

    对象池一般在服务端使用,所以稳定性是第一的. 欢迎提意见 unit uMyObjectPool;interfaceusesSyncObjs, Classes, Windows, SysUtils;ty ...

最新文章

  1. 并行口设计数字键盘实验
  2. php 接收序列化数据,PHP如何序列化数据?
  3. 深度学习与计算机视觉系列(2)_图像分类与KNN
  4. 干死该死的横向滚动条
  5. win7 VS2008 不需新建工程 命令行编译lua5.1.5
  6. 序列化加密字段_自动加密可序列化的类
  7. redis排行榜之日排行周排行设计
  8. 01-09 Linux三剑客-awk
  9. nvme装系统不能自引导_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里...
  10. 中国全国行政代码、邮政编码、区号、名称、简称、经纬度 数据库
  11. JavaScript学习手册三:JS运算符
  12. 松下机器人找原点步骤_松下机器人操作规程
  13. 什么是VXLAN?VXLAN技术细节及应用案例
  14. 工业企业成本费用的核算方法
  15. 跟着陶哲轩学数学 目录
  16. 永久域名注册流程知识
  17. 表达式之谜---半斤(复合赋值表达式)
  18. 图片去黑底原理(做个笔记)
  19. S7-200与配备CU240BE-2的G120变频器进行USS通信的具体方法和步骤
  20. CKA考试笔记,仅做个人学习使用

热门文章

  1. 基于机器学习的文本分类算法的研究
  2. 【行业了解】天眼查、企查查、启信宝、爱企查
  3. U盘格式化后容量变小了_内存丢失如何恢复?
  4. 01背包问题的填表方法
  5. “AI复活了我的妻子,但我决定跟她说再见了”
  6. 简述XSS攻击及其防范措施
  7. 给仍在「 选品 」的跨境卖家提个醒!
  8. 不要低估实现难度,聊聊当下热议的“元宇宙”是什么?
  9. QQ空间批量删除留言
  10. 终端上网_家里wifi上网很慢怎么办?通过这4招,让网速快到飞起来