前后台数据传输问题----AES加密,前台JS加密,后台JAVA解密。

一、JS中加密(解密)数据,采用的是谷歌的CryptoJS静态件

       链接: https://pan.baidu.com/s/1l5pHY4g45zzL85dDs8M82Q

               (如果CSDN无法直接跳转,建议使用浏览器进行访问)
       提取码:4v6p

  1. jsp页面需要引入两个js,一个是加密的规则,另一个是加密的算法。(注意引入的顺序)
    
    

     

  2.  js加密实现

    //word为需要加密的String字符
    function encrypt(word){
             //密钥--应和后台java解密或是前台js解密的密钥保持一致(16进制)
             var key = CryptoJS.enc.Utf8.parse("1111wwww2222uuuu");   
             //偏移量
             var srcs = CryptoJS.enc.Utf8.parse(word);  
             //算法
             var encrypted = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});  
             //替换--防止值为“1”的情况
             var reg = new RegExp('/',"g");
             return encrypted.toString().replace(reg,"#");  
    }  

     

  3. js解密实现
function decrypt(word){  
         var key = CryptoJS.enc.Utf8.parse("1111wwww2222uuuu");   
         var decrypt = CryptoJS.AES.decrypt(word, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});  
         return CryptoJS.enc.Utf8.stringify(decrypt).toString();  
    }  

 

二、java中解密(加密)数据实现

  1. 创建加密工具类
    package com.sinosoft.utility;
     
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.spec.SecretKeySpec;
     
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.lang3.StringUtils;
     
    import sun.misc.BASE64Decoder;
     
    /**
     * 加密工具类 实现aes加密、解密
     */
    @SuppressWarnings("restriction")
    public class AesUtil {
     
    	//密钥(16进制,和前台保持一致,或者是作为参数直接传过来也可以)
    	private static final String defaultKey = "1111wwww2222uuuu";
            //算法PKCS5Padding
    	private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
            //测试数据
    	private static final String testContent = "1";
     
    	//自测
    	public static void main(String[] args) throws Exception {
    		System.out.println("加密前:" + testContent);
     
    		String encrypt = encrypt(testContent);
    		System.out.println("加密后:" + encrypt);
     
    		String decrypt = decrypt(encrypt);
    		System.out.println("解密后:" + decrypt);
    	}
     
    	
     
    	//AES加密--为base 64 code
    	public static String encrypt(String content) throws Exception {
    		return base64Encode(aesEncryptToBytes(content));
    	}
    
            //AES解密--并解密base 64 code
    	public static String decrypt(String encryptStr) throws Exception {
                    encryptStr.replaceAll("#","/");
    		return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr));
    	} 
    
     
    	//base 64 encode编码
    	private static String base64Encode(byte[] bytes) {
    		return Base64.encodeBase64String(bytes);
    	}
     
    	//base 64 decode解码---》因为传过来的值是通过base64编码而后再进行aes加密出来的,所以解密之前先进行base64解码
    	private static byte[] base64Decode(String base64Code) throws Exception {
    		return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
    	}
     
    
    	//AES加密
    	private static byte[] aesEncryptToBytes(String content) throws Exception {
    		KeyGenerator kgen = KeyGenerator.getInstance("AES");
    		kgen.init(128);
    		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
    		cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(defaultKey.getBytes(), "AES"));
     
    		return cipher.doFinal(content.getBytes("utf-8"));
    	}
    
    	//AES解密
    	private static String aesDecryptByBytes(byte[] encryptBytes) throws Exception {
    		KeyGenerator kgen = KeyGenerator.getInstance("AES");
    		kgen.init(128);
    		Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
    		cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
    		byte[] decryptBytes = cipher.doFinal(encryptBytes);
     
    		return new String(decryptBytes,"utf-8");
    	}
     
    
     
    }
    

     

  2. java类中具体调用实现。

    //提供调用的方法
    public static String getAes(String data){
        if(!StringUtils.isEmpty(data)){
            String str = AesUtil.decrypt(data);
            return str;
        }
        return data;
    }

     

三、以上js加密解密,和java加密解密,皆可通用,组合。

四、本文经由思考并解决部分问题而整理出来,参考博客

     http://blog.csdn.net/z83986976/article/details/51027150;

     https://blog.csdn.net/u010648555/article/details/68066629

你可能感兴趣的:(Java,编程,主意,AES加密,前后台数据传输,AES加密乱码)