【crypto-js】前端DES对称加解密

作者 : admin 本文共1766个字,预计阅读时间需要5分钟 发布时间: 2024-06-16 共3人阅读

导读

为了数据传输的安全可靠,常常在前端会将数据(明文)进行加密保护后,再传输给后端进行数据处理,在接收数据时往往也是密文接收,前端解密后进行数据呈现。
【crypto-js】插件包含有对称加密(DES、AES),哈希算法(MD5、SHA 、HMAC),流式加密(RC4、Rabbit)。项目运用最多的就是对称加解密,所谓对称加解密就是密钥key是一样的,加密的key和解密的key一致。此篇主要记录DES的使用;AES加解密在下一篇。

安装

npm i crypto-js

引入

import CryptoJS from 'crypto-js'

CryptoJS 公共类

1、enc 指定字符编码模式

包含8个API: “Hex”,“Latin1”,“Utf8”,“Utf16BE”, “Utf16”, “Utf16LE”,“Base64”,“Base64url”
常用的CryptoJS.enc.Utf8 ,指定Utf-8编码

console.log(Object.keys(CryptoJS.enc))

【crypto-js】前端DES对称加解密插图

2、mode 模式

包含 “CBC”,“CFB”, “CTR”,“CTRGladman”,“OFB”, “ECB”,这些模式可以选择,那主要是看后端加解密的模式是咋样的,跟后端保持一致。
ECB 密钥的固定长度为128位,固定的明文生成固定的密文,安全性低。
CBC 密钥的固定长度256位,并且需要一个16字节的IV偏移量保证相同的明文每次生成的密文不一样,安全性高。

3、pad 模式

“Pkcs7”, “AnsiX923”, “Iso10126”, “Iso97971”, “ZeroPadding”,“NoPadding”
【crypto-js】前端DES对称加解密插图(1)
跟后端加解密保持一致。

4、iv偏移量

CipherOption里面的属性,mode== ECB时,不需要iv

5、DES加密

比较老旧的一种加密方式,有56位密钥长度,密钥长度较短,安全性逐渐变弱。

加密函数

DES/CBC/PK7 方式加密

  var  defKey = '自定义密钥'
  
  encrypt(message, keyStr) {
    //加密(密码)
    keyStr = keyStr ? keyStr : defKey
    let key = CryptoJS.enc.Utf8.parse(keyStr) // 密钥
    let iv = CryptoJS.enc.Utf8.parse(keyStr)  // 偏移量
    let srcs = CryptoJS.enc.Utf8.parse(JSON.stringify(message))  // message明文,待加密的字符串
    //  DES/CBC/PK7
    let encrypted = CryptoJS.DES.encrypt(srcs, key, { mode: CryptoJS.mode.CBC, iv: iv, padding: CryptoJS.pad.Pkcs7 }) 
    return encrypted.ciphertext.toString()
  },
解密函数
  decrypt(message, keyStr) {
    //解密(密码)
    keyStr = keyStr ? keyStr : defKey
    let key = CryptoJS.enc.Utf8.parse(keyStr)
    let iv = CryptoJS.enc.Utf8.parse(keyStr)
    let srcs = CryptoJS.enc.Hex.parse(message)
    let decrypt = CryptoJS.DES.decrypt({ ciphertext: srcs }, key, {
      mode: CryptoJS.mode.CBC,
      iv: iv,
      padding: CryptoJS.pad.Pkcs7,
    })
    return decrypt.toString(CryptoJS.enc.Utf8)
  },
应用
import { encrypt, decrypt} from '@/utils/des.js'

let _param = ref('hello des')
console.log('加密了:', encrypt(_param.value, '11111111')) //加密了: 43eb2b0bc56132543ac100140a79590b
console.log('解密了:', decrypt('43eb2b0bc56132543ac100140a79590b', '11111111')) // 解密了: "hello des"
本站无任何商业行为
个人在线分享 » 【crypto-js】前端DES对称加解密
E-->