Cipher 意为密码。在计算机领域,它又泛指密码学算法。
密码学算法涉及到对称加密和非对称加密。
在 crypto-js 中,只支持对称加密算法。
因此,本节主要论述对称加密的相关常用算法。
1. Config
在笔者的测试中,crypto-js 的相关算法,只有内部处理逻辑的差异导致结果的差异,但各个加密算法的整体使用方式基本都是一致的。
CryptoJS 的加密算法支持配置 key、iv、mode 以及 padding。
基础使用方式如下:
js
CryptoJS.AES.encrypt(message, key, {
iv,
mode,
padding
})
CryptoJS.AES.decrypt(encryptResult, key, {
iv,
mode,
padding
})key即是密钥。
key 支持两种模式:string 字符串或者 wordArray 实例。
- 当
key是string字符串时,iv是非必需的。
CryptoJS.AES.encrypt 会将字符串自动进行 CryptoJS.PBKDF2 哈希化,重新赋值。并且内部会自动生成一个随机 iv。
- 当
key是wordArray实例,iv是必需的,需要使用者手动传入,且类型也必须是wordArray实例。
iv指的是Initialization Vector,即初始向量。一般会设置随机数,不同的向量,最终会生成不同的加/解密结果。但相同的向量,每次的结果都是一致的。mode即是模式。分为:CBC(the default)CFBCTROFBECB
TIP
AES 默认采用的是 mode 是 CBC。这种模式下,要求 key 必须是 16 位。
否则会报错:Malformed UTF-8 data。
无论 mode 是什么,iv 的长度不作限制。
padding即是填充。分为:Pkcs7(the default)Iso97971AnsiX923Iso10126ZeroPaddingNoPadding
2.AES
AES 意为 Advanced Encryption Standard,即高级加密标准。
key设置为字符串:
js
const CryptoJS = require('crypto-js')
const message = 'Hello'
const key = 'abcdefghijklmnop'
const encryptResult = CryptoJS.AES.encrypt(message, key)
const decryptResult = CryptoJS.AES.decrypt(encryptResult, key)
console.log(encryptResult.iv, encryptResult.ciphertext)
console.log(decryptResult.toString(CryptoJS.enc.Utf8))key设置为wordArray实例:
js
const CryptoJS = require('crypto-js')
const message = 'Hello'
const key = CryptoJS.enc.Utf8.parse('abcdefghijklmnop')
const iv = CryptoJS.enc.Utf8.parse('abcdefghijklmnop')
const encryptResult = CryptoJS.AES.encrypt(message, key, {
iv
})
const decryptResult = CryptoJS.AES.decrypt(encryptResult, key, {
iv
})
console.log(encryptResult.iv, encryptResult.ciphertext)
console.log(decryptResult.toString(CryptoJS.enc.Utf8))3.DES
DES 意为 Data Encryption Standard,即数据加密标准。
key设置为字符串:
js
const CryptoJS = require('crypto-js')
const message = 'Hello'
const key = 'abcdefghijklmnop'
const encryptResult = CryptoJS.DES.encrypt(message, key)
const decryptResult = CryptoJS.DES.decrypt(encryptResult, key)
console.log(encryptResult.iv, encryptResult.ciphertext)
console.log(decryptResult.toString(CryptoJS.enc.Utf8))key设置为wordArray实例:
js
const CryptoJS = require('crypto-js')
const message = 'Hello'
const key = CryptoJS.enc.Utf8.parse('abcdefghijklmnop')
const iv = CryptoJS.enc.Utf8.parse('abcdefghijklmnop')
const encryptResult = CryptoJS.DES.encrypt(message, key, {
iv
})
const decryptResult = CryptoJS.DES.decrypt(encryptResult, key, {
iv
})
console.log(encryptResult.iv, encryptResult.ciphertext)
console.log(decryptResult.toString(CryptoJS.enc.Utf8))4.TripleDES
TripleDES 通过多次应用 DES 算法来增加安全性。
具体来说,它使用了三次 DES 加密操作。
key设置为字符串:
js
const CryptoJS = require('crypto-js')
const message = 'Hello'
const key = 'abcdefghijklmnop'
const encryptResult = CryptoJS.TripleDES.encrypt(message, key)
const decryptResult = CryptoJS.TripleDES.decrypt(encryptResult, key)
console.log(encryptResult.iv, encryptResult.ciphertext)
console.log(decryptResult.toString(CryptoJS.enc.Utf8))key设置为wordArray实例:
js
const CryptoJS = require('crypto-js')
const message = 'Hello'
const key = CryptoJS.enc.Utf8.parse('abcdefghijklmnop')
const iv = CryptoJS.enc.Utf8.parse('abcdefghijklmnop')
const encryptResult = CryptoJS.TripleDES.encrypt(message, key, {
iv
})
const decryptResult = CryptoJS.TripleDES.decrypt(encryptResult, key, {
iv
})
console.log(encryptResult.iv, encryptResult.ciphertext)
console.log(decryptResult.toString(CryptoJS.enc.Utf8))