[ delphi ] AES-256-ECB 加密、解密算法控件说明
AES-256加密、解密算法控件说明 delphi
- 前言
- 1. 控件属性
- 1.1 SourceEncodingType:源字符串的编码方式
- 1.2 AlgoMode: 算法模式
- 1.3 KeyBit: 密钥长度
- 1.4 KeyStr: 当前密钥
- 1.5 PaddingType:补齐方式
- 1.6 InitVector:初始向量
- 1.7 SourceStr:源字符串
- 2. 公共方法
- 2.1 Bytes2HexStr:字节流转16进制字符串
- 2.2 HexStr2Bytes:16进制字符串转字节流
- 2.3 EnCodeBase64:字节流转换成Base64字符串
- 2.4 DeCodeBase64:Base64字符串还原成字节流
- 2.5 EncryptStringToBytes:AES加密,返回字节流
- 2.6 EncryptStringToBase64:AES加密,返回Base64编码
- 2.7 EncryptStreamToBytes:加密数据流到字节流
- 2.8 DecryptStringToBytes:解密字符串到字节流
- 2.9 DecryptStringToString:解密字符串到字符串
- 2.10 DecryptStreamToBytes:解密数据流到字节流
- 3. 需要注意
- 4. 其它技巧
- 5. 控件-源代码
源代码下载
前言
在微信支付、公众号等开发过程中,需要用到AES加密方法,例如微信支付中的[退款结果通知],就需要使用AES-256-ECB解密(PKCS7Padding)。但是在Delphi原生没有提供这个算法,所以就在网上找,看是否有这个代码,还好网上很多,一大堆。但基本上都是使用的ElAES.pas代码,本身ElAES.pas代码直接使用就已经够了,但是大家都包了一层,无非就是更方便使用。
为了方便使用,主要是为了搞清楚AES加密,我做成了控件,把相关的属性独立列出来,清晰管理,另外提供了一些公共函数,便于开发过程中使用。
1. 控件属性
1.1 SourceEncodingType:源字符串的编码方式
TEncodingType = (etANSI,etUnicode,etUTF8,etBase64);
这个属性是一个重要的属性,因为开起来一样的文字,其内部编码可以不一样,这就是说加入对字符串: 你好 进行加密,那么可能出现的结果不一样,为什么,因为我们看到的 你好 编码可能是不同的。
序号 | 编码方式 | 字节流 |
---|---|---|
1 | ANSI | C4 E3 BA C3 |
2 | Unicode | 60 4F 7D 59 |
3 | UTF-8 | E4 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);
关于补齐方式,网上有很多说法,纷乱无比。但归纳起来,大致意思是说:
PKCS5Padding:最后一包数据按照差几补几的方式,包大小是8个字节;
PKCS7Padding:也有最后一包数据按照差几补几的方式说法,也有说是差几个就补几个0。说法不一!!
ZeroPadding:字面理解就是不需要对齐补足。
由于核心算法ElAES.pas并不是我们写的,也不想详细研究具体的算法,发现ElAES.pas并没有提供8个字节一包的算法,似乎都是16个字节一包。我们想做8个字节都不行。网上在线检查AES的似乎也没有区分这两个。根据这个情况,我在控件中的具体做法是:
PKCS5Padding:16个字节一包,最后一包差几就不足几个几,不差就补16个16。
PKCS7Padding:16个字节一包,最后一包差几就不足几个0,不差就补16个0。
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. 控件-源代码
源代码下载!
[ delphi ] AES-256-ECB 加密、解密算法控件说明相关推荐
- aes 256 ecb 加解密 pkcs7补全 python JS
python aes 256 ecb 加解密 功能 实现 Python ECB 256 JS版本 ECB 算法 JS版本 CBC 算法Pkcs7填充 SQL AES 在线验证网站 notice 功能 ...
- java aes128加密解密_java AES 128 位加密解密算法
最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥 ...
- Go Nodejs Java Aes 128 ECB加密解密结果保持一致
在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...
- Delphi调用C#的加密解密(Base64/AES/DES/MD5可扩充)
1. 背景: 近期,由于工作上与第三方公司传输数据的时候需要采取数据加密,但是我们采用的时较低版本的Delphi 6:由于加密算法等差异,导致在传输的加密数据第三方一致解析不了(具体问题表现为base ...
- java aes cfb 256_aes加密解密源码,包括aes128、aes192、aes256位,以及cbc、cfb、ecb、ofb、pcbc模式...
AES加解密总共有以下这些 算法/模式/填充 字节加密后数据长度 不满16字节加密后长度 AES/CBC/NoPadding ...
- AES加密解密算法Java实现
AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...
- 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )
文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...
- angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现
今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...
- DES加密解密算法(前端后端)
DES加密解密算法(前端&后端) 原作者 阿弥陀佛1114 原文链接:https://blog.csdn.net/zong1114/article/details/51754470 DES对 ...
- AES和RSA加密解密(前后台交互)
一.AES和RSA简单介绍 AES:对称加解密,加密解密使用同一个秘钥. RSA:非对称加解密,使用公钥加密数据,只有对应的私钥才能解密,加密方和解密方各自保存秘钥对中的一个.(这里推荐一个RSA密钥 ...
最新文章
- HTML DOM getElementById() 方法
- [shell] if else以及大于、小于、等于逻辑表达式
- 日常检查IBM P系列小型机状态的项目及其相关命令
- wxWidgets:wxWidgets 示例展示了 wxDisplay 类的特性
- P2590-[ZJOI2008]树的统计【树链剖分,线段树】
- activiti7 和业务_华电集团电子商务平台非招标业务操作指南
- php運行環境,php運行環境搭建!!!
- ProtoBuf与JSON
- Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件
- python isnumberic用法_NETASST技术博客
- Windows程式开发设计指南--视窗和讯息
- 三相全桥整流电路_什么是三相全波整流电路,三相全波整流电路的工作原理是什么,三相全波整流电路电路图...
- 微服务如何拆分,能解决哪些问题?
- 谷歌浏览器翻译显示服务器失败,谷歌浏览器翻译失败的解决办法 来看看吧
- EasyCVR边缘计算网关助力安防视频场景化AI落地,让智能无处不在
- 生活娱乐 装修最容易被忽视的十大装修细节
- 通过Docker 安装 cloudera manager 平台
- Opencv用hsv识别车牌(含源码)
- gohbase的使用
- 介绍一下什么是大数据