理解AES加密解密的使用方法

2021-08-21 21:36:26 字數 2514 閱讀 2989

很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。

本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。

相比於其他加密,aes加密似乎模式很多,包括ecb、cbc等等等等,每個模式又包括iv引數和padding引數,並且,不同語言對aes加密的庫設計有區別。這些導致aes加密在不同人之間聯調會很麻煩。

不難理解,對越長的字串進行加密,代價越大,所以通常對明文進行分段,然後對每段明文進行加密,最後再拼成乙個字串。塊加密的乙個要面臨的問題就是如何填滿最後一塊?所以這就是padding的作用,使用各種方式填滿最後一塊字串,所以對於解密端,也需要用同樣的padding來找到最後一塊中的真實資料的長度。

aes分為幾種模式,比如ecb,cbc,cfb等等,這些模式除了ecb由於沒有使用iv而不太安全,其他模式差別並沒有太明顯,大部分的區別在iv和key來計算密文的方法略有區別。

另外,aes分為aes128,aes256等,表示期待秘鑰的長度,比如aes256秘鑰的長度應該是256/8的32位元組,一些語言的庫會進行自動擷取,讓人以為任何長度的秘鑰都可以。而這其實是有區別的。

iv稱為初始向量,不同的iv加密後的字串是不同的,加密和解密需要相同的iv,既然iv看起來和key一樣,卻還要多乙個iv的目的,對於每個塊來說,key是不變的,但是只有第乙個塊的iv是使用者提供的,其他塊iv都是自動生成。

iv的長度為16位元組。超過或者不足,可能實現的庫都會進行補齊或截斷。但是由於塊的長度是16位元組,所以一般可以認為需要的iv是16位元組。

aes塊加密說過,padding是用來填充最後一塊使得變成一整塊,所以對於加密解密兩端需要使用同一的padding模式,大部分padding模式為pkcs5, pkcs7, nopadding。

所以,在設計aes加密的時候

- 對於加密端,應該包括:加密秘鑰長度,秘鑰,iv值,加密模式,padding方式。

- 對於解密端,應該包括:解密秘鑰長度,秘鑰,iv值,解密模式,padding方式。

這裡使用nodejs的cryptojs庫模擬aes加密解密

var crypto = require("crypto");

var algorithm='aes-256-cbc';

var key = new buffer("aaaabbbbccccddddeeeeffffgggghhhh");

var iv = new buffer("1234567812345678");

function

encrypt

(text)

function

decrypt

(text)

var text="ni你好hao";

var encoded=encrypt(text)

console.log(encoded);

console.log(decrypt(encoded))

結果如下

wfh4hzic3dc0pjxa9v/rgq==

ni你好hao

nodejs自帶的並不能自動配置padding等引數,演示起來並不方便。

於是使用另乙個框架crypto-js的nodejs庫實現和之前完全相同的版本

var cryptojs = require("crypto-js");

var key ="aaaabbbbccccddddeeeeffffgggghhhh";

var iv = "1234567812345678";

function

encrypt

(text))

}function

decrypt

(text))

return result.tostring(cryptojs.enc.utf8)

}var text="ni你好hao";

var encoded=encrypt(text)

console.log(encoded.tostring());

console.log(decrypt(encoded))

現在aes的引數都變成可配置的,接下來驗證一下之前對aes的理解。

ni你好hao,經過pkcs7後,輸出為

wfh4hzic3dc0pjxa9v/rgq==
nopadding後,輸出為

otsnypfx1sf6c2e=
zeropadding後,輸出為

otsnypfx1sf6c2gfyxmida==
pkcs7的結果和其他結果相差很大,很難相信其padding是補充最後一塊

有趣的是pkcs7的結果和zeropadding的結果通過同樣的解密設定,能解出同樣的字串ni你好hao

aes加密解密的秘鑰有一對,乙個是iv乙個是key,並且他們的長度都有嚴格要求。

padding的作用似乎不只是補齊最後,如果自己什麼都對,但是加密失敗,可以嘗試不同padding

理解AES加密解密的使用方法

很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。相比於其他加密,aes加密似乎模式很多,包括ecb cbc等等等等,每個模式又包括iv引數和padding引數,並且,不...

理解AES加密解密的使用方法

很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。相比於其他加密,aes加密似乎模式很多,包括ecb cbc等等等等,每個模式又包括iv引數和padding引數,並且,不...

AES加密解密前端使用方法

npm install crypto jsimport cryptojs from crypto js var key cryptojs.enc.latin1.parse 秘鑰 秘鑰 後端提供 var iv cryptojs.enc.latin1.parse 常量 常量 後端提供 export de...