JavaScript实现AES加解密 Java实现AES加解密

本文展示了如何在Java和JavaScript中使用AES加密算法进行数据加密和解密。提供了详细的代码示例,包括加密、解密、加密后转Base64以及解密Base64数据的方法。在Java中使用了 Cipher 和 SecretKeySpec 类,而在JavaScript中则依赖了 crypto-js 库。
摘要由CSDN通过智能技术生成

Java版

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;

public class AESUtils {

    private static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";
    private static final String KEY_ALGORITHM = "AES";

    /**
     * AES加密
     *
     * @param data 要加密的数据
     * @param key  key 长度16
     * @param iv   iv 长度16
     * @return 加密后的数据byte[]
     * @throws Exception
     */
    public static byte[] encrypt(byte[] data, byte[] key, byte[] iv) throws Exception {
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
        Key k = new SecretKeySpec(key, KEY_ALGORITHM);
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, k, paramSpec);
        return cipher.doFinal(data);
    }

    /**
     * AES解密
     *
     * @param bytes 加密后的数据byte[] bytes
     * @param key   key 长度16
     * @param iv    iv 长度16
     * @return 解密后的数据
     * @throws Exception
     */
    public static byte[] decrypt(byte[] bytes, byte[] key, byte[] iv) throws Exception {
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
        Key k = new SecretKeySpec(key, KEY_ALGORITHM);
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, k, paramSpec);
        return cipher.doFinal(bytes);
    }

    /**
     * AES加密后转base64
     *
     * @param data 要加密的数据
     * @param key  key 长度16
     * @param iv   iv 长度16
     * @return base64
     * @throws Exception
     */
    public static String encodeToBase64String(String data, byte[] key, byte[] iv) throws Exception {
        return Base64.getEncoder().encodeToString(encrypt(data.getBytes(StandardCharsets.UTF_8), key, iv));
    }

    /**
     * 解密经AES加密后的base64
     *
     * @param data 经AES加密后的base64
     * @param key  key 长度16
     * @param iv   iv 长度16
     * @return 解密后的数据
     * @throws Exception
     */
    public static String decodeFromBase64String(String data, byte[] key, byte[] iv) throws Exception {
        byte[] bytes = Base64.getDecoder().decode(data);
        return new String(decrypt(bytes, key, iv));
    }

    public static void main(String[] args) {
        try {
            byte[] key = "S0JsiZY2eHlgnRmv".getBytes();
            byte[] iv = "kezfopM2kJUn1VUN".getBytes();
            System.out.println("key:" + new String(key));
            System.out.println("iv:" + new String(iv));
            String content = "这是原始数据";
            String cipher = AESUtils.encodeToBase64String(content, key, iv);
            System.out.println("加密后的数据 -> \"" + cipher + "\"");
            String plain = AESUtils.decodeFromBase64String(cipher, key, iv);
            System.out.println("解密后的数据 -> \"" + plain + "\"");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出

key:S0JsiZY2eHlgnRmv
iv:kezfopM2kJUn1VUN
加密后的数据 -> "cbHhL/Zmwtu6ffZL8sgIgUmAci1X9GdGIPl9/DMNOUQ="
解密后的数据 -> "这是原始数据"

JavaScript版

安装

 npm install crypto-js --save

github地址:https://github.com/brix/crypto-js

// import CryptoJS from 'crypto-js'
let CryptoJS = require('crypto-js')

/**
 * AES加密
 * @param {string} data 要加密的数据
 * @param {string} key 长度16
 * @param {string} iv 长度16
 * @returns 返回base64
 */
function Encrypt(data, key, iv) {
  if (key && iv) {
    key = CryptoJS.enc.Utf8.parse(key);
    iv = CryptoJS.enc.Utf8.parse(iv);
  }
  let srcs = CryptoJS.enc.Utf8.parse(data);
  let encrypt = CryptoJS.AES.encrypt(srcs, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,  //AES加密的模式
    padding: CryptoJS.pad.Pkcs7
  });
  return CryptoJS.enc.Base64.stringify(encrypt.ciphertext);
}

/**
 * AES 解密
 * @param {string} data 经AES加密后base64编码后的数据
 * @param {string} key 长度16
 * @param {string} iv 长度16
 * @returns 解密后的数据
 */
function Decrypt(data, key, iv) {
  if (key && iv) {
    key = CryptoJS.enc.Utf8.parse(key);
    iv = CryptoJS.enc.Utf8.parse(iv);
  }
  let base64 = CryptoJS.enc.Base64.parse(data);
  let src = CryptoJS.enc.Base64.stringify(base64);
  let decrypt = CryptoJS.AES.decrypt(src, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,  //AES解密的模式
    padding: CryptoJS.pad.Pkcs7
  });
  return decrypt.toString(CryptoJS.enc.Utf8).toString();
}

function test() {
  let key = 'S0JsiZY2eHlgnRmv'
  let iv = 'kezfopM2kJUn1VUN'
  let data = '这是原始数据'
  let encrypted = Encrypt(data, key, iv)
  console.log("加密后的数据:" + encrypted)
  console.log("解密后的数据:" + Decrypt(encrypted, key, iv)) 
}
test()

输出

加密后的数据:cbHhL/Zmwtu6ffZL8sgIgUmAci1X9GdGIPl9/DMNOUQ=
解密后的数据:这是原始数据
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值