AES 加密算法的node應用

AES

屬於對稱加密算法python

三要素:算法

  • 祕鑰
  • 填充
  • 模式

祕鑰

對稱加密之因此對稱,是由於這類算法對明文的加密和解密使用的是同一個祕鑰安全

AES 支持三種長度的祕鑰:性能

  • 128位 128的性能最好
  • 192位
  • 256位 256的安全性最高,加密輪數更多。

這三種不一樣長度的祕鑰,在底層的加密過程當中,處理的加密輪數不一樣。ui

填充

AES加密分組的特性:AES加密並非將明文一股腦加密成密文,而是先拆分紅一個個的獨立的明文塊,每一個明文快塊128bit。加密

假設一段明文塊長度是192bit,按照每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit,此時就須要對不足128bit的明文塊進行填充。code

填充的 種類:
  • NoPadding

不作任何填充,要求明文必須是128bit的整數倍ip

  • PKCS7Padding

用0填充,對於末尾爲0的,容易誤判,從而解密出錯,並不推薦it

  • ZeroPadding(當明文塊少於16個字節,少多少個字節,就用對應數字來填充。例如,少5個,後面就是5個5,少6個,就是6個6)
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來填充
  • AnsiX923
  • Iso10126
  • Iso97971

模式

AES的工做模式,體如今吧明文塊加密成密文塊的過程當中io

AES算法提供了5種工做模式:

  • CBC
  • EBC
  • CTR
  • CFB
  • OFB

模式之間的主體思想是近似的,在處理細節上有 一些差異。

ECB模式:

ECB(Electronic CodeBook Book) 是最簡單的工做模式,在這個模式下,每一個明文快的加密都是徹底獨立的,互不干涉。

優勢:

  • 簡單
  • 有利於並行計算

缺點:

  • 相同的明文塊加密後是相同明文塊,安全性較差
CBC模式

CBC模式(Cipher Block Chaining)引入了一個新的概念:初始向量IV(Initialization Vector)

IV的做用相似MD5中的"加鹽",目的是防止相同的明文加密成爲相同的密文

CBC模式在每個明文塊加密前會讓明文塊和一個值先作異或操做。

IV爲做爲初始化變量,參與第一個明文塊的異或,後續的每個明文塊和它前一個明文塊加密後的密文相異或。

這樣,相同明文塊加密後的密文顯然不同。

優勢:

  • 安全性高

缺點:

  • 沒法並行計算,性能上不如ECB
  • 引入了初始化向量IV,增長了複雜度

加密流程總結:

  • 把明文按照128bit拆分紅若干個明文塊
  • 按照選擇的填充方式對最後一個明文塊填充
  • 每個明文塊利用AES加密器和祕鑰,加密成密文塊
  • 拼接全部的密文快,成爲最終的密文結果

示例:

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);
相關文章
相關標籤/搜索