展开全部

unit AES;

interface

uses

SysUtils, Classes, Math, ElAES;

type

TKeyBit = (kb128, kb192, kb256);

function StrToHex(Value: string): string;

function HexToStr(Value: string): string;

function EncryptString(Value: string; Key: string;

KeyBit: TKeyBit = kb128): string;

function DecryptString(Value: string; Key: string;

KeyBit: TKeyBit = kb128): string;

function EncryptStream(Stream: TStream; Key: string;

KeyBit: TKeyBit = kb128): TStream;

function DecryptStream(Stream: TStream; Key: string;

KeyBit: TKeyBit = kb128): TStream;

procedure EncryptFile(SourceFile, DestFile: string;

Key: string; KeyBit: TKeyBit = kb128);

procedure DecryptFile(SourceFile, DestFile: string;

Key: string; KeyBit: TKeyBit = kb128);

implementation

function StrToHex(Value: string): string;

var

I: Integer;

begin

Result := '';

for I := 1 to Length(Value) do

Result := Result + IntToHex(Ord(Value[I]), 2);

end;

function HexToStr(Value: string): string;

var

I: Integer;

begin

Result := '';

for I := 1 to Length(Value) do

begin

if ((I mod 2) = 1) then

Result := Result + Chr(StrToInt('0x'+ Copy(Value, I, 2)));

end;

end;

{  --  字符62616964757a686964616fe4b893e5b19e31333363363438串加密函数 默认按照 128 位密匙加密 --  }

function EncryptString(Value: string; Key: string;

KeyBit: TKeyBit = kb128): string;

var

SS, DS: TStringStream;

Size: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;

begin

Result := '';

SS := TStringStream.Create(Value);

DS := TStringStream.Create('');

try

Size := SS.Size;

DS.WriteBuffer(Size, SizeOf(Size));

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

if KeyBit = kb128 then

begin

FillChar(AESKey128, SizeOf(AESKey128), 0 );

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

EncryptAESStreamECB(SS, 0, AESKey128, DS);

end;

{  --  192 位密匙最大长度为 24 个字符 --  }

if KeyBit = kb192 then

begin

FillChar(AESKey192, SizeOf(AESKey192), 0 );

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

EncryptAESStreamECB(SS, 0, AESKey192, DS);

end;

{  --  256 位密匙最大长度为 32 个字符 --  }

if KeyBit = kb256 then

begin

FillChar(AESKey256, SizeOf(AESKey256), 0 );

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

EncryptAESStreamECB(SS, 0, AESKey256, DS);

end;

Result := StrToHex(DS.DataString);

finally

SS.Free;

DS.Free;

end;

end;

{  --  字符串解密函数 默认按照 128 位密匙解密 --  }

function DecryptString(Value: string; Key: string;

KeyBit: TKeyBit = kb128): string;

var

SS, DS: TStringStream;

Size: Int64;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;

begin

Result := '';

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

DS := TStringStream.Create('');

try

Size := SS.Size;

SS.ReadBuffer(Size, SizeOf(Size));

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

if KeyBit = kb128 then

begin

FillChar(AESKey128, SizeOf(AESKey128), 0 );

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

DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey128, DS);

end;

{  --  192 位密匙最大长度为 24 个字符 --  }

if KeyBit = kb192 then

begin

FillChar(AESKey192, SizeOf(AESKey192), 0 );

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

DecryptAESStreamECB(SS, SS.Size - SS.Position, AESKey192, DS);

end;

{  --  256 位密匙最大长度为 32 个字符 --  }

if KeyBit = kb256 then

begin

FillChar(AESKey256, SizeOf(AESKey256), 0 );

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

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

end;

Result := DS.DataString;

finally

SS.Free;

DS.Free;

end;

end;

{  --  流加密函数 默认按照 128 位密匙解密 --  }

function EncryptStream(Stream: TStream; Key: string;

KeyBit: TKeyBit = kb128): TStream;

var

Count: Int64;

OutStrm: TStream;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;

begin

OutStrm := TStream.Create;

Stream.Position := 0;

Count := Stream.Size;

OutStrm.Write(Count, SizeOf(Count));

try

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

if KeyBit = kb128 then

begin

FillChar(AESKey128, SizeOf(AESKey128), 0 );

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

EncryptAESStreamECB(Stream, 0, AESKey128, OutStrm);

end;

{  --  192 位密匙最大长度为 24 个字符 --  }

if KeyBit = kb192 then

begin

FillChar(AESKey192, SizeOf(AESKey192), 0 );

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

EncryptAESStreamECB(Stream, 0, AESKey192, OutStrm);

end;

{  --  256 位密匙最大长度为 32 个字符 --  }

if KeyBit = kb256 then

begin

FillChar(AESKey256, SizeOf(AESKey256), 0 );

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

EncryptAESStreamECB(Stream, 0, AESKey256, OutStrm);

end;

Result := OutStrm;

finally

OutStrm.Free;

end;

end;

{  --  流解密函数 默认按照 128 位密匙解密 --  }

function DecryptStream(Stream: TStream; Key: string;

KeyBit: TKeyBit = kb128): TStream;

var

Count, OutPos: Int64;

OutStrm: TStream;

AESKey128: TAESKey128;

AESKey192: TAESKey192;

AESKey256: TAESKey256;

begin

OutStrm := TStream.Create;

Stream.Position := 0;

OutPos :=OutStrm.Position;

Stream.ReadBuffer(Count, SizeOf(Count));

try

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

if KeyBit = kb128 then

begin

FillChar(AESKey128, SizeOf(AESKey128), 0 );

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

DecryptAESStreamECB(Stream, Stream.Size - Stream.Position,

AESKey128, OutStrm);

end;

{  --  192 位密匙最大长度为 24 个字符 --  }

if KeyBit = kb192 then

begin

FillChar(AESKey192, SizeOf(AESKey192), 0 );

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

DecryptAESStreamECB(Stream, Stream.Size - Stream.Position,

AESKey192, OutStrm);

end;

{  --  256 位密匙最大长度为 32 个字符 --  }

if KeyBit = kb256 then

begin

FillChar(AESKey256, SizeOf(AESKey256), 0 );

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

DecryptAESStreamECB(Stream, Stream.Size - Stream.Position,

AESKey256, OutStrm);

end;

OutStrm.Size := OutPos + Count;

OutStrm.Position := OutPos;

Result := OutStrm;

finally

OutStrm.Free;

end;

end;

java delphi aes加密算法_谁有C#与delphi通用的AES加密算法相关推荐

  1. java多级审批流程_[SharePoint 工作流] 如何设计一个通用的多级多审核工作流程(三):工作流开发...

    在上2篇博客中,我们有了工作流定义的列表,也有了关联表单和启动表单,现在就是开始开发这个通用工作流的时刻了. 工作流的基本构成就是:一个While循环控制工作流的运转,While里的Task Repl ...

  2. java 动态生成证书_如何用java自带的工具生成证书

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  3. java祖冲之加密算法_对称加密和非对称加密

    一  非对称加密 非对称加密和解密花费的时间长 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),一般使用公钥进行加密,使用私钥进行解密. 常见的非对称加密 ...

  4. aes加密算法_令你的文件安全有了新方法AES-256-GCM加密网站免费用

    您是否一直在寻找文件安全性的解决方案? 有一个免费的文件加密网站,在这里效果很好. 常用的加密技术主要分为两类:接近表示加密和不接近表示加密,AES加密是一种接近表示加密,即使用加密 泄露秘密沟通的关 ...

  5. 3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例

    java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...

  6. java md5加密解密_技术09期:数据安全之加密与实现

    前言:大数据时代,每个人的生活中都不存在所谓的绝对"秘密",通过网络上的数据信息可以分析出一个人生活的各种痕迹.因此,保障大数据信息安全至关重要. 本文主要介绍了散列算法.对称加密 ...

  7. Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析

    文章目录 Pre 小Demo 类图结构 CyclicBarrier核心方法源码解读 int await() int await(long timeout, TimeUnit unit) int dow ...

  8. Java Review - 并发编程_读写锁ReentrantReadWriteLock的原理源码剖析

    文章目录 ReentrantLock VS ReentrantReadWriteLock 类图结构 非公平的读写锁实现 写锁的获取与释放 void lock() void lockInterrupti ...

  9. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

  10. Java web小项目_个人主页(2)—— 边缘加速原理与实现

    摘自:Java web小项目_个人主页(2)-- 边缘加速原理与实现 作者:丶PURSUING 发布时间: 2021-03-27 14:44:40 网址:https://blog.csdn.net/w ...

最新文章

  1. 记录一个Ubuntu的一个官方地址
  2. 系统变量file.encoding对Java的运行影响有多大?(转)good
  3. apache建立虚拟主机[转载]
  4. python.123登录_python用户登录3次
  5. 基于python的图书管理系统测试步骤_Django admin实现图书管理系统菜鸟级教程完整实例...
  6. EtherCAT有什么优点?为何如此受欢迎?
  7. oracle查询结果展示,ORACLE构造查询日期展示结果
  8. MySQL进阶路:从小工到专家的必读书籍和必备工具
  9. python grep awk_文本处理三剑客:grep、sed和awk命令介绍
  10. 微积分手机版 pk 清华大学微积分教程
  11. Java调用网易163邮箱,发送邮件
  12. STM32F103和STM32F401的ADC多通道采集DMA输出
  13. 三维全息显微镜成生物成像领域“新宠”
  14. 中文汉字转拼音首字母大写
  15. arm linux 中littlevgl支持tslib的方法
  16. 用一个比喻来解释对 同步 异步 阻塞 非阻塞 轮询 回调 的理解
  17. 写给想要开始跑步的人
  18. linux设备驱动读书笔记(转)
  19. 计算机上摄氏度的符号怎么输,Word中摄氏度符号℃怎么打
  20. 国外信号与系统经典书籍收藏

热门文章

  1. 兜兜转转,华为与李一男终于在汽车行业重逢,两者将展开决战?
  2. MTK平台 后视镜系列 声控参数调整方法
  3. 计算机保研面试知识点,保研面试(附面试笔试机试)
  4. python中快速验证输入的是否为回文
  5. 工作中常见的方法和法则(简单的法则不简单)
  6. html bottom没有效果,css 设置margin-top或margin-bottom失效不取作用的解决方法
  7. nginx 配置 apple-app-site-association
  8. Ionic5项目android打包流程
  9. 响应“上上下下左左右右”按键键事件 “按两次返回键退出”
  10. 星球大战1-6[Star Wars 1-6]