aes/rsa java和js兼容可用
java
/** * 字符编码 */ private static final String CHARACTER_ENCODING = "utf-8"; /** * 生成密钥的基本字符 */ private static final String BASE_CHARACTER = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; private AesUtil() { } /** * 生成随机密钥 * * @return 随机密钥 */ public static String initKey() { return generateKeyOrIV(); } /** * 生成初始向量 * * @return 初始向量 */ public static String initIV() { return generateKeyOrIV(); } /** * 生成随机密钥、初始向量 */ private static String generateKeyOrIV() { StringBuilder sBuilder = new StringBuilder(); double r; for (int i = 0; i < 16; i++) { r = Math.random() * BASE_CHARACTER.length(); sBuilder.append(BASE_CHARACTER.charAt((int) r)); } return sBuilder.toString(); } /** * 使用AES算法加密字符串 * * @param data 需要加密的原文 * @param key 密钥(16位字母、数字或符号) * @param iv 初始向量(16位字母、数字或符号),使用CBC模式,需要一个向量iv,可增加加密算法的强度 * @return 加密后进行Base64的密文 * @throws Exception 加密失败 */ public static String encrypt(String data, String key, String iv) throws Exception { return Base64.getEncoder().encodeToString(encrypt(data.getBytes(CHARACTER_ENCODING), key, iv)); } /** * 使用AES算法加密数据 * * @param data 需要加密的数据 * @param key 密钥(16位字母、数字或符号) * @param iv 初始向量(16位字母、数字或符号),使用CBC模式,需要一个向量iv,可增加加密算法的强度 * @return 加密后的数据 * @throws Exception 加密失败 */ public static byte[] encrypt(byte[] data, String key, String iv) throws Exception { return crypto(Cipher.ENCRYPT_MODE, data, key, iv); } /** * 使用AES算法解密字符串 * * @param data 需要解密的密文 * @param key 密钥(16位字母、数字或符号) * @param iv 初始向量(16位字母、数字或符号) * @return 解密后的明文 * @throws Exception 解密失败 */ public static String decrypt(String data, String key, String iv) throws Exception { byte[] decrypted = decrypt(Base64.getDecoder().decode(data), key, iv); return new String(decrypted, CHARACTER_ENCODING); } /** * 使用AES算法解密数据 * * @param data 需要解密的数据 * @param key 密钥(16位字母、数字或符号) * @param iv 初始向量(16位字母、数字或符号) * @return 解密后的数据 * @throws Exception 解密失败 */ public static byte[] decrypt(byte[] data, String key, String iv) throws Exception { return crypto(Cipher.DECRYPT_MODE, data, key, iv); } /** * 加解密数据 */ private static byte[] crypto(int opmode, byte[] content, String key, String iv) throws Exception { SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(CHARACTER_ENCODING), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 算法/模式/补码方式 IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes(CHARACTER_ENCODING)); cipher.init(opmode, keySpec, ivParameterSpec); return cipher.doFinal(content); } private static final String AES_SRC_DATA = "测试某某代码呢"; public static void main(String[] args) throws Exception { Map<String,Object> map=new HashMap<>(); String aesKey = initKey(); String aesIV = initIV(); map.put("aesKey", aesKey); map.put("aesIV", aesIV); // AES 加密和解密 String aesEncrypt =encrypt(AES_SRC_DATA, aesKey, aesIV); String aesDecrypt =decrypt(aesEncrypt, aesKey, aesIV); map.put("aesEncrypt", aesEncrypt); map.put("aesDecrypt", aesDecrypt); System.out.println(map); }
js :需要引入aes.js
/** * AES加密 * * @param content 待加密的内容 * @param secretKey 密钥 * @param iv 初始向量 * @returns {string} 加密结果 */ function aesEncrypt(content, secretKey, iv) { return CryptoJS.AES.encrypt(content, CryptoJS.enc.Utf8.parse(secretKey), { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString(); } /** * AES解密 * * @param content 待解密的内容 * @param secretKey 密钥 * @param iv 初始向量 * @returns {string} 解密结果 */ function aesDecrypt(content, secretKey, iv) { return CryptoJS.AES.decrypt(content, CryptoJS.enc.Utf8.parse(secretKey), { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString(CryptoJS.enc.Utf8); } $(function () { // AES加密 console.log(aesEncrypt('测试某某代码呢', 'KCAMPlbdU4tMj9N9','sxLk29K4h1uW7dND')); //AES解密 console.log(aesDecrypt('CHMmx7QoSiaEiUCcH9lW6r/J5ZHUUxMEwNmVBR4nniI=', 'KCAMPlbdU4tMj9N9','sxLk29K4h1uW7dND')); });
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)