很多人對於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...