很多人對於aes加密並不是很了解,導致互相之間進行加密解密困難。
本文用簡單的方式來介紹aes在使用上需要的知識,而不涉及內部演算法。最後給出例子來幫助理解aes加密解密的使用方法。
相比於其他加密,aes加密似乎模式很多,包括ecb、cbc等等等等,每個模式又包括iv引數和padding引數,並且,不同語言對aes加密的庫設計有區別。這些導致aes加密在不同人之間聯調會很麻煩。
不難理解,對越長的字串進行加密,代價越大,所以通常對明文進行分段,然後對每段明文進行加密,最後再拼成乙個字串。塊加密的乙個要面臨的問題就是如何填滿最後一塊?所以這就是padding的作用,使用各種方式填滿最後一塊字串,所以對於解密端,也需要用同樣的padding來找到最後一塊中的真實資料的長度。
aes分為幾種模式,比如ecb,cbc,cfb等等,這些模式除了ecb由於沒有使用iv而不太安全,其他模式差別並沒有太明顯,大部分的區別在iv和key來計算密文的方法略有區別。具體可參考 wiki說明
另外,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加密的時候
這裡使用nodejs的cryptojs庫模擬aes加密解密
結果如下var crypto =
require
("crypto");
var algorithm=
'aes-256-cbc'
;var key =
newbuffer
("aaaabbbbccccddddeeeeffffgggghhhh");
var iv =
newbuffer
("1234567812345678");
function
encrypt
(text)
function
decrypt
(text)
var text=
"ni你好hao"
;var encoded=
encrypt
(text)
console.
log(encoded)
;console.
log(
decrypt
(encoded)
)
nodejs自帶的並不能自動配置padding等引數,演示起來並不方便。wfh4hzic3dc0pjxa9v/rgq==
ni你好hao
於是使用另乙個框架crypto-js的nodejs庫實現和之前完全相同的版本
現在aes的引數都變成可配置的,接下來驗證一下之前對aes的理解。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)
)
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...