Skip to content

Cipher 意为密码。在计算机领域,它又泛指密码学算法。

密码学算法涉及到对称加密非对称加密

crypto-js 中,只支持对称加密算法。

因此,本节主要论述对称加密的相关常用算法。

1. Config

在笔者的测试中,crypto-js 的相关算法,只有内部处理逻辑的差异导致结果的差异,但各个加密算法的整体使用方式基本都是一致的

CryptoJS 的加密算法支持配置 keyivmode 以及 padding

基础使用方式如下:

js
CryptoJS.AES.encrypt(message, key, {
  iv,
  mode,
  padding
})

CryptoJS.AES.decrypt(encryptResult, key, {
  iv,
  mode,
  padding
})
  1. key 即是密钥

key 支持两种模式:string 字符串或者 wordArray 实例。

  • keystring 字符串时,iv 是非必需的。

CryptoJS.AES.encrypt 会将字符串自动进行 CryptoJS.PBKDF2 哈希化,重新赋值。并且内部会自动生成一个随机 iv

  • keywordArray 实例,iv 是必需的,需要使用者手动传入,且类型也必须是 wordArray 实例
  1. iv 指的是 Initialization Vector,即初始向量。一般会设置随机数,不同的向量,最终会生成不同的加/解密结果。但相同的向量,每次的结果都是一致的。

  2. mode 即是模式。分为:

    • CBC (the default)
    • CFB
    • CTR
    • OFB
    • ECB

TIP

AES 默认采用的是 modeCBC这种模式下,要求 key 必须是 16

否则会报错:Malformed UTF-8 data

无论 mode 是什么,iv 的长度不作限制。

  1. 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))