[ delphi ] AES-256-ECB 加密、解密算法控件说明


源代码下载

前言

在微信支付、公众号等开发过程中,需要用到AES加密方法,例如微信支付中的[退款结果通知],就需要使用AES-256-ECB解密(PKCS7Padding)。但是在Delphi原生没有提供这个算法,所以就在网上找,看是否有这个代码,还好网上很多,一大堆。但基本上都是使用的ElAES.pas代码,本身ElAES.pas代码直接使用就已经够了,但是大家都包了一层,无非就是更方便使用。

为了方便使用,主要是为了搞清楚AES加密,我做成了控件,把相关的属性独立列出来,清晰管理,另外提供了一些公共函数,便于开发过程中使用。

1. 控件属性

在这里插入图片描述

1.1 SourceEncodingType:源字符串的编码方式

TEncodingType = (etANSI,etUnicode,etUTF8,etBase64);

这个属性是一个重要的属性,因为开起来一样的文字,其内部编码可以不一样,这就是说加入对字符串: 你好 进行加密,那么可能出现的结果不一样,为什么,因为我们看到的 你好 编码可能是不同的。

序号编码方式字节流
1ANSIC4 E3 BA C3
2Unicode60 4F 7D 59
3UTF-8E4 BD A0 E5 A5 BD

如果不能清晰理解这个,就可能导致加密解密的时候出现不一致的错误而无解决办法!

1.2 AlgoMode: 算法模式

TAlgoMode = (amECB, amCBC);

1.3 KeyBit: 密钥长度

TKeyBit = (kb128, kb192, kb256);

1.4 KeyStr: 当前密钥

字符串行形式的密钥,正常来说,应该是字节流作为密钥,但是一般为了可见,所以也设置成字符串属性。切记!只作为ANSI编码使用!

1.5 PaddingType:补齐方式

TPaddingType= (PKCS5Padding, PKCS7Padding, ZeroPadding);

关于补齐方式,网上有很多说法,纷乱无比。但归纳起来,大致意思是说:

  1. PKCS5Padding:最后一包数据按照差几补几的方式,包大小是8个字节;

  2. PKCS7Padding:也有最后一包数据按照差几补几的方式说法,也有说是差几个就补几个0。说法不一!!

  3. ZeroPadding:字面理解就是不需要对齐补足。

由于核心算法ElAES.pas并不是我们写的,也不想详细研究具体的算法,发现ElAES.pas并没有提供8个字节一包的算法,似乎都是16个字节一包。我们想做8个字节都不行。网上在线检查AES的似乎也没有区分这两个。根据这个情况,我在控件中的具体做法是:

  1. PKCS5Padding:16个字节一包,最后一包差几就不足几个几,不差就补16个16。

  2. PKCS7Padding:16个字节一包,最后一包差几就不足几个0,不差就补16个0。

  3. ZeroPadding:不需要补足,直接加密使用。

注意:控件实际测试结果是PKCS7Padding和ZeroPadding是一样的!之所以这样做是为了方便各种情况,如果还不能满足需求,有源代码,可以直接修改!

1.6 InitVector:初始向量

字符串形式的,仅作为ANSI编码使用。

1.7 SourceStr:源字符串

无论是加密,还是解密,源字符串都需要在这个位置。

2. 公共方法

2.1 Bytes2HexStr:字节流转16进制字符串

function Bytes2HexStr(Bytes: TBytes; Delia: string = ' '; BCount: Byte = 16) : string;

2.2 HexStr2Bytes:16进制字符串转字节流

function HexStr2Bytes(const HexStr : string) : TBytes;

2.3 EnCodeBase64:字节流转换成Base64字符串

function EnCodeBase64(const B : TBytes) : string

2.4 DeCodeBase64:Base64字符串还原成字节流

function DeCodeBase64(const S : string) : TBytes;

2.5 EncryptStringToBytes:AES加密,返回字节流

function EncryptStringToBytes  : TBytes;

2.6 EncryptStringToBase64:AES加密,返回Base64编码

function EncryptStringToBase64 : string;

2.7 EncryptStreamToBytes:加密数据流到字节流

function EncryptStreamToBytes(const S_Stream : TStream) : TBytes;   //返回字节

2.8 DecryptStringToBytes:解密字符串到字节流

function DecryptStringToBytes  : TBytes;  //这个是最基本

2.9 DecryptStringToString:解密字符串到字符串

function DecryptStringToString(EncodingType : TEncodingType = etANSI) : string;

其中EncodingType表示解密后的字节流按照那种编码方式显示.

2.10 DecryptStreamToBytes:解密数据流到字节流

function DecryptStreamToBytes(const S_Stream : TStream) : TBytes;

3. 需要注意

加密,解密都需要使用相关的参数,切记加密完成后,如果是返回的Base64编码,那么解密的时候就需要把SourceEncodingType更改成Base64。

真正的加密、解密都是对数据流来说的,但是我们为了能够看清楚,所以就直接对字符串进行加密、解密,这就必然导致编码方式统一的问题,如果不注意这个肯定会出问题。

另外网上有些在线监测AES加密、解密的,其实也没有区分编码方式,不用迷信,相信自己吧。

4. 其它技巧

Delphi开发,我们经常会需要设置属性,例如控件等。在本Demo中,专门演示了TValueListEditor的用法,以后使用可以作为参考!

在这里插入图片描述

加密完成后,如果需要解密,请把SourceEncodingType更改为Base64!!!

5. 控件-源代码

源代码下载!

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Delphi是一种编程语言,可以使用它来进行AES(高级加密标准)算法加密解密操作。AES是一种对称加密算法,可以使用相同的密钥进行加密解密。 在Delphi,可以使用TNetEncoding类来进行AES加密解密。首先,需要引入System.NetEncoding单元,然后可以使用TNetEncoding类的静态方法进行加密解密操作。 对于加密,可以使用TNetEncoding.Base64.EncodeBytesToString方法将明文数据加密为字符串。需要提供密钥和初始向量(IV)作为参数。 对于解密,可以使用TNetEncoding.Base64.DecodeStringToBytes方法将加密过的字符串解密为字节数组。同样需要提供密钥和IV作为参数。 以下是一个简单的示例: ```delphi uses System.NetEncoding; function AESEncrypt(const plainText, key, iv: string): string; var encoding: TNetEncoding; plainBytes, cipherBytes: TBytes; begin encoding := TNetEncoding.Base64; plainBytes := TEncoding.UTF8.GetBytes(plainText); cipherBytes := encoding.EncodeBytes(TNetEncoding.ANSI.GetBytes(key), TNetEncoding.ANSI.GetBytes(iv), plainBytes); Result := encoding.EncodeBytesToString(cipherBytes); end; function AESDecrypt(const cipherText, key, iv: string): string; var encoding: TNetEncoding; cipherBytes, plainBytes: TBytes; begin encoding := TNetEncoding.Base64; cipherBytes := encoding.DecodeStringToBytes(cipherText); plainBytes := encoding.DecodeBytes(TNetEncoding.ANSI.GetBytes(key), TNetEncoding.ANSI.GetBytes(iv), cipherBytes); Result := TEncoding.UTF8.GetString(plainBytes); end; // 使用示例 var plainText, key, iv, cipherText: string; begin plainText := 'Hello, World!'; key := '01234567890123456789012345678901'; iv := '0123456789012345'; cipherText := AESEncrypt(plainText, key, iv); ShowMessage('加密后的结果:' + cipherText); plainText := AESDecrypt(cipherText, key, iv); ShowMessage('解密后的结果:' + plainText); end; ``` 这是一个基本的Delphi代码示例,可以使用AES算法加密解密数据。注意,为了安全起见,密钥和初始向量应保密保存,并且需要相同的密钥和IV才能将加密数据正确解密出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值