使用CryptoJS中的AES实现加解密(前端后端)

最近为了解决项目中用户名、密码明文传输的问题,使用了AES在前台加密,然后在后台解密,稍微整理了一下,记录AES前台加解密和后台java加解密,以防忘记。

前台使用CryptoJS实现AES加解密的,所以要先下载组件,下载CryptoJS-v3.1.2版本之后,文件中包含components和rollups两个文件夹,components文件夹下是单个组件,rollups文件夹下是汇总,引用rollups下的aes.js文件即可。

下载地址:CryptoJS-v3.1.2

上面的下载资源是CSDN网站下载,需要积分。这里我上传到百度云,可以在百度云下载。

链接:https://pan.baidu.com/s/11xle84xGqQRGkcp1ckCNqQ 
提取码:74vr

1、前台加解密:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>AES加解密</title>
<style>  
	*{margin:0;padding:0}  
	.demo-wrap{width: 400px;height:50px;margin: 50px auto auto auto}  
</style>
<script src="./js/aes.js"></script>
<script type="text/javascript">
	function getAesString(data,key,iv){
		var key  = CryptoJS.enc.Utf8.parse(key); 
		var iv   = CryptoJS.enc.Utf8.parse(iv); 
		var encrypted =CryptoJS.AES.encrypt(data,key,{
			iv:iv, 
			mode:CryptoJS.mode.CBC,
			padding:CryptoJS.pad.Pkcs7 
		});
		return encrypted.toString();  //返回的是base64格式的密文
	}
	function getDAesString(encrypted,key,iv){
		var key  = CryptoJS.enc.Utf8.parse(key);
		var iv   = CryptoJS.enc.Utf8.parse(iv);
		var decrypted =CryptoJS.AES.decrypt(encrypted,key,{
			iv:iv,
			mode:CryptoJS.mode.CBC,
			padding:CryptoJS.pad.Pkcs7
		});
		return decrypted.toString(CryptoJS.enc.Utf8);
	}
	function getAES(){//加密
		var data =document.getElementById("data-ipt").value;//明文 
		var key  = 'abcdefghijklmn12';  //密钥
		var iv   = 'abcdefghijklmn12';
		var encrypted =getAesString(data,key,iv); //密文
		var encrypted1 =CryptoJS.enc.Utf8.parse(encrypted);
		document.getElementById("encrypted").innerHTML = encrypted; 
	}
	function getDAes(){//解密  
		var encrypted =document.getElementById("encrypted").innerHTML; //密文
		var key  = 'abcdefghijklmn12'; 
		var iv   = 'abcdefghijklmn12'; 
		var decryptedStr =getDAesString(encrypted,key,iv);  
		document.getElementById("decrypted").innerHTML = decryptedStr; 
	}
</script>
</head>
<body>
	<div class="demo-wrap">
		<input type="text" id="data-ipt"/>
		<button οnclick="getAES();">AES加密</button> 
		<button οnclick="getDAes();">AES解密</button> 
		<br/>
		加密后的数据:  
		<p id ="encrypted"></p>  
		解密后的数据:
		<p id="decrypted"></p>  
	</div>
</body>
</html>

2、后台加解密:

package com.yanzhengma.servlet;
 
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
 
import org.apache.commons.codec.binary.Base64;
 
public class AESTest {
 
	public static void main(String args[]) throws Exception{
		String content = "test";
		String key = "abcdefghijklmn12";
		String iv = "abcdefghijklmn12";
		//加密
		byte[] encrypted = AES_CBC_Encrypt(content.getBytes(), key.getBytes(), iv.getBytes()); 
		//解密
		byte[] decrypted = AES_CBC_Decrypt(decryptBASE64("加密后的密文"), key.getBytes(), iv.getBytes());
		
		System.out.println("加密后:"+encryptBASE64(encrypted));
		System.out.println("解密后:"+byteToString(decrypted));
	}
	
	public static String byteToString(byte[] byte1){  
        return new String(byte1);  
    }
	
	public static byte[] AES_CBC_Encrypt(byte[] content, byte[] keyBytes, byte[] iv){
		try {
			SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE,key, new IvParameterSpec(iv));
			byte[] result = cipher.doFinal(content); 
			return result;
		} catch (Exception e) {
			System.out.println("exception:"+e.toString());
		}
		return null;
	}
	
	public static byte[] AES_CBC_Decrypt(byte[] content, byte[] keyBytes, byte[] iv){
		try {
			SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE,key, new IvParameterSpec(iv)); 
			byte[] result = cipher.doFinal(content);
			return result;
		} catch (Exception e) {
			System.out.println("exception:"+e.toString());
		}
		return null;
	}
	
	//字符串装换成base64
	public static byte[] decryptBASE64(String key) throws Exception {   
        return Base64.decodeBase64(key.getBytes());  
    }
	//base64装换成字符串
	public static String encryptBASE64(byte[] key) throws Exception {   
        return new String(Base64.encodeBase64(key));  
    } 
}

原文链接:https://blog.csdn.net/armys/article/details/79213631

 

3、补充说明:

首先需要说明一下,以上的前端代码加密解密程序都是没有问题的。包括前端加密后,后台命令行运行解密都是可以正常运行的。(包括中文问题,都不会出现乱码问题的。)

但是:如果在你的控制器端,前端对中文内容进行加密的时候,控制器进行解密是会出现乱码问题。

4、在实际项目中,后台(控制器)解密出现中文乱码问题

问题描述:

aes在解密后,用byte[]进行接收,需要使用new String();进行转换为字符。只需要指定new String()编码格式便可以解决解密时乱码问题。
接下来我们看下2块解密时部分代码:
1.将aes得到结果转变为字符,不设置编码格式
   new String(aesDecrypt(Base64.decode(ciphertext),Base64.decode(key)))
2.将aes得到结果转变为字符,设置编码格式
   new String(aesDecrypt(Base64.decode(ciphertext),Base64.decode(key)),"UTF-8");

所以根据上面的描述:我们将第2步中的解密方法修改一下即可

public static String byteToString(byte[] byte1){  
        //return new String(byte1);  

         return new String(byte1, "UTF-8");  //使用utf-8编码,防止中文乱码
 }

到此,项目中的中文乱码问题解决。


原文链接:https://blog.csdn.net/u012012240/article/details/54090958

 

其他资料:

使用 CryptoJS 中的AES 实现前后端通用加解密技术

Vue项目使用AES做加密

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值