JS AES加密解密(ECB/CBC)

今天配合后端完成账户密码的加密和解密,使用的是AES加密算法

环境配置

ECB加密解密

var key = CryptoJS.enc.Utf8.parse("zhgerXHBVaaKm8xy")
var plaintText = 'onlystar'
var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
    mode: CryptoJS.mode.ECB,  
    padding: CryptoJS.pad.Pkcs7
})

console.log("加密前:"+plaintText) // 加密前:onlystar
console.log("加密后:"+encryptedData) // 加密后:cp7hxlPgStaA4Jod5uKCuQ==

encryptedData = encryptedData.ciphertext.toString()

var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData)
console.log("解密前hex:"+encryptedHexStr) // 解密前hex:729ee1c653e04ad680e09a1de6e282b9
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr)
console.log("解密前:"+encryptedBase64Str) // 解密前:cp7hxlPgStaA4Jod5uKCuQ==
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { 
    mode: CryptoJS.mode.ECB,  
    padding: CryptoJS.pad.Pkcs7
})

var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8)
console.log("解密后:"+decryptedStr) // 解密后:onlystar

CBC加密解密

var key = CryptoJS.enc.Utf8.parse("zhgerXHBVaaKm8xy")
var plaintText = 'onlystar'
var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
    iv:  CryptoJS.enc.Utf8.parse(key),
    mode: CryptoJS.mode.CBC,  
    padding: CryptoJS.pad.Pkcs7
})

console.log("加密前:"+plaintText) // 加密前:onlystar
console.log("加密后:"+encryptedData) // 加密后:cp7hxlPgStaA4Jod5uKCuQ==

encryptedData = encryptedData.ciphertext.toString()

var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedData)
console.log("解密前hex:"+encryptedHexStr) // 解密前hex:729ee1c653e04ad680e09a1de6e282b9
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr)
console.log("解密前:"+encryptedBase64Str) // 解密前:cp7hxlPgStaA4Jod5uKCuQ==
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { 
    iv:  CryptoJS.enc.Utf8.parse(key),
    mode: CryptoJS.mode.CBC,  
    padding: CryptoJS.pad.Pkcs7
})

var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8)
console.log("解密后:"+decryptedStr) // 解密后:onlystar

封装方法

const DecryptEcb = (keyword, secretKey) => {
  try {
    let key = CryptoJS.enc.Utf8.parse(secretKey)
    let encryptedHexStr = CryptoJS.enc.Hex.parse(keyword)
    let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr)
    let decrypt = CryptoJS.AES.decrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding })
    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
    return decryptedStr.toString()
  } catch (error) {
    console.log(error)
    return ''
  }
}

使用

const { username, password, secretKey } = data
// 解密
const user = DecryptEcb(username, secretKey)
const pwd = DecryptEcb(password, secretKey)

文章作者: 徐辉波
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 徐辉波 !
评论
 上一篇
Chrome插件开发实战 Chrome插件开发实战
chrome作为目前最流行的浏览器,备受前端推崇,原因除了其对于前端标准的支持这一大核心原因之外,还有就是其强大的扩展性。如今基于其内核开发的插件已经非常多,给我们的生活带来了非常大的方便。 这里我们来讲一下其便利的插件开发 前置知识
2019年05月27日
下一篇 
React基础知识点 React基础知识点
react是三大前端主流框架之一。它有着庞大多生态体系,几乎所有开发需求都有成熟的解决方案;它上手简单,可在几小时内上手React技术,但知识很广,需要更多时间才能完全驾驭;它社区强大,使用人群多,可以很容易的找到志同道合的人一起学习
2019年05月18日