2020-07-29 js使用AES加解密

背景

越來越嚴(yán)格的安全要求,迫使前端需要對(duì)交互報(bào)文進(jìn)行加密。

方案

選擇了AES加密方案

實(shí)現(xiàn)

AES-CBC

const aesjs = require('aes-js')

function CryptoCbc ({ key, iv }) {
  this.key = aesjs.utils.utf8.toBytes(key)
  this.iv = aesjs.utils.utf8.toBytes(iv)
}

// 加密
CryptoCbc.prototype.encrypt = function (text) {
  let aesCbc = new aesjs.ModeOfOperation.cbc(this.key, this.iv)
  let textBytes = aesjs.padding.pkcs7.pad(aesjs.utils.utf8.toBytes(text)) // 使用PKCS7Padding填充

  let encryptedBytes = aesCbc.encrypt(textBytes)
  let encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes) // 得到加密字符串
  return encryptedHex
}

// 解密
CryptoCbc.prototype.decrypt = function (encryptedHex) {
  let aesCbc = new aesjs.ModeOfOperation.cbc(this.key, this.iv)
  let encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex)

  var decryptedBytes = aesjs.padding.pkcs7.strip(aesCbc.decrypt(encryptedBytes))
  let decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes)
  return decryptedText
}

let cryptoCbc = new CryptoCbc({
  key: '39067A6F8088F81E9C2BB5D46A8C0F60', // 32位
  iv: 'EFEF3C38B05F5871' // 16位
})

let text = 'wEis11elYDR1aPWX123' // 待加密文本
let encryptedHex = cryptoCbc.encrypt(text) // 加密結(jié)果
let decryptedText = cryptoCbc.decrypt(encryptedHex) // 解密結(jié)果
console.log(encryptedHex)
console.log(decryptedText)

AES-ECB

const aesjs = require('aes-js')

function CryptoEcb ({ key }) {
  this.key = aesjs.utils.utf8.toBytes(key)
}

// 加密
CryptoEcb.prototype.encrypt = function (text) {
  let aesEcb = new aesjs.ModeOfOperation.ecb(this.key)
  let textBytes = aesjs.padding.pkcs7.pad(aesjs.utils.utf8.toBytes(text))

  let encryptedBytes = aesEcb.encrypt(textBytes)
  let encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes) // 得到加密字符串
  return encryptedHex
}

// 解密
CryptoEcb.prototype.decrypt = function (encryptedHex) {
  let aesEcb = new aesjs.ModeOfOperation.ecb(this.key)
  let encryptedBytes = aesjs.utils.hex.toBytes(encryptedHex)

  var decryptedBytes = aesjs.padding.pkcs7.strip(aesEcb.decrypt(encryptedBytes))
  let decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes)
  return decryptedText
}

let cryptoEcb = new CryptoEcb({
  key: '39067A6F8088F81E9C2BB5D46A8C0F60', // 32位
})

let text = 'wEis11elYDR1aPWX123' // 待加密文本
let encryptedHex = cryptoEcb.encrypt(text) // 加密結(jié)果
let decryptedText = cryptoEcb.decrypt(encryptedHex) // 解密結(jié)果
console.log(encryptedHex)
console.log(decryptedText)

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容