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);

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

  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. 控件-源代码

源代码下载!

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

  1. aes 256 ecb 加解密 pkcs7补全 python JS

    python aes 256 ecb 加解密 功能 实现 Python ECB 256 JS版本 ECB 算法 JS版本 CBC 算法Pkcs7填充 SQL AES 在线验证网站 notice 功能 ...

  2. java aes128加密解密_java AES 128 位加密解密算法

    最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具. 密钥长度问题 默认 Java 中仅支持 128 位密钥,当使用 256 位密钥 ...

  3. Go Nodejs Java Aes 128 ECB加密解密结果保持一致

    在多语言的生产环境下,常常是由一种语言进行加密而由另一种语言来进行解密,因此有必要保持各种语言之间加密解密算法的一致性.下面列出了Go,Nodejs,Java 的 Aes-128-Ecb的加密解密算法 ...

  4. Delphi调用C#的加密解密(Base64/AES/DES/MD5可扩充)

    1. 背景: 近期,由于工作上与第三方公司传输数据的时候需要采取数据加密,但是我们采用的时较低版本的Delphi 6:由于加密算法等差异,导致在传输的加密数据第三方一致解析不了(具体问题表现为base ...

  5. java aes cfb 256_aes加密解密源码,包括aes128、aes192、aes256位,以及cbc、cfb、ecb、ofb、pcbc模式...

    AES加解密总共有以下这些 算法/模式/填充                 字节加密后数据长度       不满16字节加密后长度 AES/CBC/NoPadding                 ...

  6. AES加密解密算法Java实现

    AES加密算法是密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DE ...

  7. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

  8. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现

    今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...

  9. DES加密解密算法(前端后端)

    DES加密解密算法(前端&后端) 原作者 阿弥陀佛1114  原文链接:https://blog.csdn.net/zong1114/article/details/51754470 DES对 ...

  10. AES和RSA加密解密(前后台交互)

    一.AES和RSA简单介绍 AES:对称加解密,加密解密使用同一个秘钥. RSA:非对称加解密,使用公钥加密数据,只有对应的私钥才能解密,加密方和解密方各自保存秘钥对中的一个.(这里推荐一个RSA密钥 ...

最新文章

  1. HTML DOM getElementById() 方法
  2. [shell] if else以及大于、小于、等于逻辑表达式
  3. 日常检查IBM P系列小型机状态的项目及其相关命令
  4. wxWidgets:wxWidgets 示例展示了 wxDisplay 类的特性
  5. P2590-[ZJOI2008]树的统计【树链剖分,线段树】
  6. activiti7 和业务_华电集团电子商务平台非招标业务操作指南
  7. php運行環境,php運行環境搭建!!!
  8. ProtoBuf与JSON
  9. Ionic APP 热更新 之 产品发布状态下的热更新搭建,去local-dev-addon插件
  10. python isnumberic用法_NETASST技术博客
  11. Windows程式开发设计指南--视窗和讯息
  12. 三相全桥整流电路_什么是三相全波整流电路,三相全波整流电路的工作原理是什么,三相全波整流电路电路图...
  13. 微服务如何拆分,能解决哪些问题?
  14. 谷歌浏览器翻译显示服务器失败,谷歌浏览器翻译失败的解决办法 来看看吧
  15. EasyCVR边缘计算网关助力安防视频场景化AI落地,让智能无处不在
  16. 生活娱乐 装修最容易被忽视的十大装修细节
  17. 通过Docker 安装 cloudera manager 平台
  18. Opencv用hsv识别车牌(含源码)
  19. gohbase的使用
  20. 介绍一下什么是大数据

热门文章

  1. 冬虫夏草之技术路线图之二【“术”——业务篇】
  2. 和老外聊天、发邮件常用英语缩写。
  3. 使用腾讯云轻量应用服务器搭建视频直播服务器
  4. linux文件解压缩加解密
  5. Express 框架的使用(详细)
  6. tensorboard侧视_如何调整侧视/后视镜(以及为什么需要3台显示器)
  7. golang学习之五:error、painc、recover
  8. restore和recover区别
  9. BottomNavigationView动态添加MenuItem
  10. JNCIS翻译文档之------接口2