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
)CFB
CTR
OFB
ECB
TIP
AES
默认采用的是 mode
是 CBC
。这种模式下,要求 key
必须是 16
位。
否则会报错:Malformed UTF-8 data
。
无论 mode
是什么,iv
的长度不作限制。
padding
即是填充。分为:Pkcs7
(the default
)Iso97971
AnsiX923
Iso10126
ZeroPadding
NoPadding
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))