很多人對於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加密的時候
- 對於加密端,應該包括:加密秘鑰長度,秘鑰,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是比較常用,des因為安全性比不上aes已經用的較少 對稱加密 是指加密解密都是乙個金鑰,通過改金鑰加密,也通過它解密。1.加密 加密 param content 需要加密的內容 param key 金鑰 return public static byte encrypt strin...
密碼篇 對稱加密 AES
目錄 aes介紹 rijndael加密中的一輪 rijndael解密中的一輪 對三種對稱密碼的使用 rijndael於2000年被選為新一代的標準密碼演算法 aes 在aes規格中,金鑰長度為128 192 256位元三種 rijndael使用的是spn結構 rijndael中存在反向運算 不像fe...
正確使用AES對稱加密
經常我看到專案中有人使用了對稱加密演算法,用來加密客戶或專案傳輸中的部分資料。但我注意到開發 人員由於不熟悉原理,或者簡單複製網上的 示例,有導致 存在安全風險。我經常遇到的問題,有如下 演算法位長 建議rc4 40des 563des 112aes 128 tl dr rc4 des 3des都不...