[ 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 加密、解密算法控件说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lame静态库使用
- 下一篇: libmp3lame的接口使用