JS实现AES加解密

1,565 阅读2分钟

AES (高级加密标准) 是美国联邦信息处理标准 (FIPS)。它是经过 5 年的过程,对 15 种竞争设计进行评估后选出的。CryptoJS 支持 AES-128、AES-192 和 AES-256。它将根据您传入的密钥的大小来选择变体。

1、安装

npm install crypto-js

2、封装

//引用AES源码js
import CryptoJS from 'crypto-js'

const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF");//十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412');//十六位十六进制数作为密钥偏移量

//解密方法
function Decrypt(word) {
   //返回的是解密后的对象
   let decrypt = CryptoJS.AES.decrypt(restoreBase64,key,{
        iv:iv,
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
   });

   //将解密对象转换成UTF8的字符串
   let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
   //返回解密结果
   return decryptedStr.toString();
}

//加密方法
function Encrypt(word){
    let srcs = CryptoJS.enc.Utf8.parse(word);
    //返回的是一个加密对象
    let encrypted = CryptoJS.AES.encrypt(srcs,key,{
        iv:iv,
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    });
    //将结果进行base64加密
    return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}

export {Decrypt,Encrypt}

CipherOption,加密的一些选项:

  • mode:加密模式,可取值(CBC,CFB,CTR,CTRGladman,OFB,ECB),都在CryptoJS.mode对象下
  • padding:填充方式,可取值(Pkcs7,Ansix923,Iso10126,ZeroPadding,NoPadding),都在CryptoJS.pad对象下
  • iv:偏移量,mode===ECB时,不需要iv

3、使用

import {Encrypt} from "../../utils/secret";
var userName = Encrypt(this.userName)//加密用户名
var userPassword = Encrypt(this.password)//加密用户密码
console.log('加密后:',userName)
console.log('加密后:',userPassword)

4、加入rsa传递aes秘钥的情况处理(不推荐)

// rsaHelper.js
import JsEncrypt from 'jsencrypt/bin/jsencrypt'
import { getKey, AESEnc, AESDec } from './lib/aes'


export const rsaEncode = (string = '') => {
    // const RSA = new
    const publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRQZ5O/AOAjeYAaSFf6Rjhqovws78I716I9oGF7WxCIPmcaUa1YuyLOncCCuPsaw69+RMWjdbOBp8hd4PPM/d4mKTOVEYUE0SfxhhDTZaM5CzQEUXUyXy7icQTGR5wBjrbjU1yHCKOf5PJJZZQWB06husSFZ40TdL7FdlBpZ1u1QIDAQAB";
    const encrypt = new JsEncrypt.JSEncrypt();
    encrypt.setPublicKey(publicKey);
    return encrypt.encrypt(string);
}

export const createKey = () => (getKey());

export const AES_ENCODE = (key, string = '') => {
    if (!string) throw new Error('encry content is required');
    return AESEnc(key, string);
}

export const AES_DECODE = (key, string = '') => {
    if (!string) throw new Error('encry content is required');
    return AESDec(key, string);
}

// 使用
// import { rsaEncode, AES_ENCODE, createKey } from '@/utils/rsaHelper';
// rsaEncode, AES_ENCODE, createKey
// const key = createKey();
//                         const data = {
//                             username: this.addData.userName,
//                             password: AES_ENCODE(key, this.addData.passWord),
//                             rsaEncryptKey: rsaEncode(key),
//                         }