屬於對稱加密算法python
三要素:算法
對稱加密之因此對稱,是由於這類算法對明文的加密和解密使用的是同一個祕鑰安全
AES 支持三種長度的祕鑰:性能
這三種不一樣長度的祕鑰,在底層的加密過程當中,處理的加密輪數不一樣。ui
AES加密分組的特性:AES加密並非將明文一股腦加密成密文,而是先拆分紅一個個的獨立的明文塊,每一個明文快塊128bit。加密
假設一段明文塊長度是192bit,按照每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit,此時就須要對不足128bit的明文塊進行填充。code
不作任何填充,要求明文必須是128bit的整數倍ip
用0填充,對於末尾爲0的,容易誤判,從而解密出錯,並不推薦it
1,2,3,4,5,6,2,3,4,5,4,4,4,4, # 缺4個,就用4來填充 1,2,3,4,5,6,2,3,4,5,5,5,5,5 # 缺5個,就用數字5來填充
AES的工做模式,體如今吧明文塊加密成密文塊的過程當中io
AES算法提供了5種工做模式:
模式之間的主體思想是近似的,在處理細節上有 一些差異。
ECB(Electronic CodeBook Book) 是最簡單的工做模式,在這個模式下,每一個明文快的加密都是徹底獨立的,互不干涉。
優勢:
缺點:
CBC模式(Cipher Block Chaining)引入了一個新的概念:初始向量IV(Initialization Vector)
IV的做用相似MD5中的"加鹽",目的是防止相同的明文加密成爲相同的密文
CBC模式在每個明文塊加密前會讓明文塊和一個值先作異或操做。
IV爲做爲初始化變量,參與第一個明文塊的異或,後續的每個明文塊和它前一個明文塊加密後的密文相異或。
這樣,相同明文塊加密後的密文顯然不同。
優勢:
缺點:
示例:
var CryptoJS = require("Crypto-js"); function aesEncrypto(text, key, iv) { // 加密 key = CryptoJS.enc.Utf8.parse(key); iv = CryptoJS.enc.Utf8.parse(iv); var encryptoed = CryptoJS.AES.encrypt(text, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) var encryptoed__=CryptoJS.enc.Utf8.parse(encryptoed) return encryptoed } function aesDecrypto(encryptoed, key, iv) { // 解密 key = CryptoJS.enc.Utf8.parse(key); iv = CryptoJS.enc.Utf8.parse(iv); var result = CryptoJS.AES.decrypt(encryptoed, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) return result.toString(CryptoJS.enc.Utf8) } var text = "wo ai python"; // 明文 var key = "ABC123456789"; // 祕鑰 var iv = "hehehehehehe"; // iv var encryptoed = aesEncrypto(text, key, iv); console.log(encryptoed.toString()); var decod = aesDecrypto(encryptoed, key, iv); console.log(decod);