属于对称加密算法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);