delphi mysql.pas_Delphi 一些pas
(**************************************************************)
(*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相关推荐
- 如何去掉Delphi自动生成的~.pas等临时文件
如何去掉Delphi自动生成的~.pas等临时文件 一.Delphi7 二.Delphi2010 转载于:https://www.cnblogs.com/m0488/archive/2013/05/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 提 供 者 ...
- delphi mysql dll直接_十万火急!!!那位高手用过libmysql.dll直接连接MySql数据库?如何将二进制文件保存到blob字段中? (60分)...
先用php+mysql将文件通过web方式保存到远程的服务器的blob字段中,然后用 delphi+libmysql.dll直接连接远程MySql数据库,再将数据复制到本地的MySql数据库中. 代码 ...
- delphi mysql 三层_Delphi XE 10 跨平台三层数据库应用 datasnap
(1)生成DataSnap服务器的框架 初学者都是呆子,还是用向导吧,主菜单"File"->"New"->"Other-"得到& ...
- delphi mysql 乱码_Delphi连接mysql中文乱码的解决办法
MySQL数据库不常使用,以往使用都是连接已有的数据库,从未出现乱码问题.这次做到演示版的程序,需要自己建立MySQL数据库,而使用Delphi连接时,凡是数据库中文内容都显示为"???&q ...
- delphi mysql 图片_delphi数据库图片的存取 【转】
一. 原理介绍--流式数据的类型及其应用 在Dephi中提供了TStream来支持对流式数据的操作.TStream是万流之源. 但由于它是一个抽象类,故不能被直接使用:而要使用其相应的子类, 如:TF ...
- delphi mysql 删除_Delphi 用SQL语句添加删除修改字段
1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP COLUMN column ...
- delphi mysql 图片_Delphi实现在数据库中存取图像
本实例演示如何在数据库中存取图像文件. 向窗体上添加一个TListBox组件.一个TImage组件和一个TTable组件,设计完成的主界面. 本系统中需要设计一个新的基于Paradox 7的数据库Im ...
- 基于Delphi+MySQL的大学生竞赛发布及组队系统
资源下载地址:https://download.csdn.net/download/sheziqiong/86794871 资源下载地址:https://download.csdn.net/downl ...
- Delphi对象池MyObjectPool.pas
对象池一般在服务端使用,所以稳定性是第一的. 欢迎提意见 unit uMyObjectPool;interfaceusesSyncObjs, Classes, Windows, SysUtils;ty ...
最新文章
- 并行口设计数字键盘实验
- php 接收序列化数据,PHP如何序列化数据?
- 深度学习与计算机视觉系列(2)_图像分类与KNN
- 干死该死的横向滚动条
- win7 VS2008 不需新建工程 命令行编译lua5.1.5
- 序列化加密字段_自动加密可序列化的类
- redis排行榜之日排行周排行设计
- 01-09 Linux三剑客-awk
- nvme装系统不能自引导_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里...
- 中国全国行政代码、邮政编码、区号、名称、简称、经纬度 数据库
- JavaScript学习手册三:JS运算符
- 松下机器人找原点步骤_松下机器人操作规程
- 什么是VXLAN?VXLAN技术细节及应用案例
- 工业企业成本费用的核算方法
- 跟着陶哲轩学数学 目录
- 永久域名注册流程知识
- 表达式之谜---半斤(复合赋值表达式)
- 图片去黑底原理(做个笔记)
- S7-200与配备CU240BE-2的G120变频器进行USS通信的具体方法和步骤
- CKA考试笔记,仅做个人学习使用