package com.sinosoft.fronting.util; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.Security; import java.util.Base64; /** * 前端加密方式是 CryptoJS.pad.Pkcs7 * encrypt(params) { * var key = CryptoJS.enc.Utf8.parse(AES_KEY); * var iv = CryptoJS.enc.Utf8.parse(IV); * var jsonData = JSON.stringify(params).replace(/\"/g, ""); * //下面的data参数要求是一个字符串,第一次用的时候我直接传递的是一个对象,出现了错误,要转换成字符串 * var data = CryptoJS.enc.Utf8.parse(jsonData); * var encrypted = CryptoJS.AES.encrypt(data, key, { * iv: iv, * mode: CryptoJS.mode.CBC, * padding: CryptoJS.pad.Pkcs7, * }).toString(); * return encrypted; * }, * }, * * @Description * @Author demo * @Date 2023/5/10 11:34 **/ public class EncryptUtils2 { private static String KEY = "密钥"; private static String IV = "向量"; private static final String SECRET = "AES"; private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding"; static { Security.addProvider(new BouncyCastleProvider()); } /** * 使用默认的key和iv加密 * @param data * @return * @throws Exception */ public static String encrypt(String data) throws Exception { return aes256ECBPkcs7PaddingEncrypt(data, KEY, IV); } /** * 使用默认的key和iv解密 * @param data * @return * @throws Exception */ public static String desEncrypt(String data) throws Exception { return aes256ECBPkcs7PaddingDecrypt(data, KEY, IV); } /** * AES加密ECB模式PKCS7Padding填充方式 * @param str 字符串 * @param key 密钥 * @return 加密字符串 * @throws Exception 异常信息 */ public static String aes256ECBPkcs7PaddingEncrypt(String str, String key,String iv) throws Exception { Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, SECRET),ivspec); byte[] doFinal = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)); return new String(Base64.getEncoder().encode(doFinal)); } /** * AES解密ECB模式PKCS7Padding填充方式 * @param str 字符串 * @param key 密钥 * @return 解密字符串 * @throws Exception 异常信息 */ public static String aes256ECBPkcs7PaddingDecrypt(String str, String key,String iv) throws Exception { Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8); IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, SECRET),ivspec); byte[] doFinal = cipher.doFinal(Base64.getDecoder().decode(str)); return new String(doFinal); } public static void main(String[] args) throws Exception { String admin1 = EncryptUtils2.aes256ECBPkcs7PaddingEncrypt("admin", KEY, IV); System.out.println("加密后:"+admin1); String jiemiadmin1 = EncryptUtils2.aes256ECBPkcs7PaddingDecrypt("TABx8m9jK2ie26jx96pUUQ==", KEY, IV); System.out.println("解密加密后:"+jiemiadmin1); System.out.println("=================================="); String encryptStr = EncryptUtils2.encrypt("admin@2022"); System.out.println("加密后:"+encryptStr); String decryptStr = EncryptUtils2.desEncrypt(encryptStr); System.out.println("解密加密后:"+jiemiadmin1); System.out.println("TABx8m9jK2ie26jx96pUUQ==".equals(encryptStr)+""); } }
前端用 CryptoJS.pad.Pkcs7 填充加密 java 实现加密和解密例子
最新推荐文章于 2024-07-23 11:03:32 发布