Aes 加密解密 java加密解密

使用AES加密解密代碼詳解

首先,若是是使用nodejs + vue 寫的前端, 那麼你須要npm 加載一個js文件前端

npm i crypto-js --save --save-exact
    npm install crypto-js

java代碼加密解密類

package com.telling.util.crypto;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class Aes {

	private static final Log logger = LogFactory.getLog(Aes.class); // log日誌

	private static final String ALGORITHM = "AES/ECB/PKCS5Padding"; // "算法/模式/補碼方式"

	/*****************************************************
	 * AES加密
	 * 
	 * @param content
	 *            加密內容
	 * @param key
	 *            加密密碼,由字母或數字組成 此方法使用AES-128-ECB加密模式,key須要爲16位
	 *            加密解密key必須相同,如:abcd1234abcd1234
	 * @return 加密密文
	 ****************************************************/

	public static String enCode(String content, String key) {
		if (key == null || "".equals(key)) {
			logger.info("key爲空!");
			return null;
		}
		if (key.length() != 16) {
			logger.info("key長度不是16位!");
			return null;
		}
		try {
			byte[] raw = key.getBytes(); // 得到密碼的字節數組
			SecretKeySpec skey = new SecretKeySpec(raw, "AES"); // 根據密碼生成AES密鑰
			Cipher cipher = Cipher.getInstance(ALGORITHM); // 根據指定算法ALGORITHM自成密碼器
			cipher.init(Cipher.ENCRYPT_MODE, skey); // 初始化密碼器,第一個參數爲加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操做,第二個參數爲生成的AES密鑰
			byte[] byte_content = content.getBytes("utf-8"); // 獲取加密內容的字節數組(設置爲utf-8)否則內容中若是有中文和英文混合中文就會解密爲亂碼
			byte[] encode_content = cipher.doFinal(byte_content); // 密碼器加密數據
			return Base64.encodeBase64String(encode_content); // 將加密後的數據轉換爲字符串返回
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/*****************************************************
	 * AES解密
	 * 
	 * @param content
	 *            加密密文
	 * @param key
	 *            加密密碼,由字母或數字組成 此方法使用AES-128-ECB加密模式,key須要爲16位 加密解密key必須相同
	 * @return 解密明文
	 ****************************************************/

	public static String deCode(String content, String key) {
		if (key == null || "".equals(key)) {
			logger.info("key爲空!");
			return null;
		}
		if (key.length() != 16) {
			logger.info("key長度不是16位!");
			return null;
		}
		try {
			byte[] raw = key.getBytes(); // 得到密碼的字節數組
			SecretKeySpec skey = new SecretKeySpec(raw, "AES"); // 根據密碼生成AES密鑰
			Cipher cipher = Cipher.getInstance(ALGORITHM); // 根據指定算法ALGORITHM自成密碼器
			cipher.init(Cipher.DECRYPT_MODE, skey); // 初始化密碼器,第一個參數爲加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操做,第二個參數爲生成的AES密鑰
			byte[] encode_content = Base64.decodeBase64(content); // 把密文字符串轉回密文字節數組
			byte[] byte_content = cipher.doFinal(encode_content); // 密碼器解密數據
			return new String(byte_content, "utf-8"); // 將解密後的數據轉換爲字符串返回
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/*****************************************************
	 * AES加密解密測試
	 * 
	 * @param args
	 * @return
	 ****************************************************/

	public static void main(String[] args) {
		String content = "加密解密測試";
		logger.info("加密content:" + content);
		String key = "abcd1234abcd1234";
		logger.info("加密key:" + key);
		String enResult = enCode(content, key);
		logger.info("加密result:" + enResult);
		String deResult = deCode(enResult, key);
		logger.info("解密result:" + deResult);
	}
}

java類中加密解密使用方式

@ResponseBody
	@RequestMapping("/getqingHou")
	public String getqingHou(HttpServletRequest request, HttpServletResponse response) throws Exception {

		try {

			Map map = this.getParameterMap(request);

			Map retuData = new HashMap<>(16);
			map.put("role", "admin");

			/*****************前端傳過來的加密值,進行解密*********************************************************/
			String keyC = map.get("keyC").toString();
			String contC = map.get("contentC").toString();
			System.out.println(keyC + "   :   "  + contC);
			
			String decC = new String(Aes.deCode(contC, keyC));
			System.out.println("前端傳進來的數據: 解密後----》》》 " + decC);
			System.out.println("------------------------------------------------------------------");
			/**************************加密字符串,解密字符串****************************************************/
			// 1234567890ABCDEF1234567890ABCDEf
			String key = UUID.randomUUID().toString().replace("-", "").toUpperCase().toString().substring(0,14) + "==";
			String src = "Ejian111234";
			System.out.println("key---->>>> "+key);
			// 加密字符串
			String enc = Aes.enCode(src, key);
			System.out.println("加密後---》》》 " + enc);
			// 解密後
			String dec = new String(Aes.deCode(enc, key));
			System.out.println("解密後----》》》 " + dec);
			System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
			/***************************加密數組,傳到前端進行解密***************************************************/
			
			String  mapEnc = Aes.enCode(JSON.toJSONString(map), key);
			System.out.println("集合類型加密後的數據: " + mapEnc);
			
			
			retuData.put("enc", enc);
			retuData.put("key", key);
			retuData.put("map", mapEnc);

			logger.info("+++++++get user info !" + retuData);
			return JSON.toJSONString(retuData);
		} catch (LoginException e) {
			logger.error(e.getMessage());
			return e.getErrorCode() + "_" + e.getMessage();
		}
	}

js代碼加密解密方法

const CryptoJS = require("crypto-js")

/*****************************************************
 * AES加密
 * @param content 加密內容
 * @param key 加密密碼,由字母或數字組成
       此方法使用AES-128-ECB加密模式,key須要爲16位
       加密解密key必須相同,如:abcd1234abcd1234
 * @return 加密密文
 ****************************************************/
export function encrypt(content, key) {
    const sKey = CryptoJS.enc.Utf8.parse(key);
    const sContent = CryptoJS.enc.Utf8.parse(content);
    const encrypted = CryptoJS.AES.encrypt(sContent, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
}

/*****************************************************
 * AES解密
 * @param content 加密密文
 * @param key 加密密碼,由字母或數字組成
       此方法使用AES-128-ECB加密模式,key須要爲16位
       加密解密key必須相同,如:abcd1234abcd1234
 * @return 解密明文
 ****************************************************/
export function decrypt(content, key) {
    const sKey = CryptoJS.enc.Utf8.parse(key);
    const decrypt = CryptoJS.AES.decrypt(content, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
    return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}

前端加密解密使用方法

<script>
    import { getqingHou } from "api/test.js";
    import { decrypt, encrypt } from "api/cryptoAes.js"

    var CryptoJS = require("crypto-js")
    export default {
        name: "login",
        created() {
            this.getqingHouFun()
        },
        methods: {
            getqingHouFun() {
                console.log('============test===start===========')
                getqingHou({test: 'test', keyC: '1234567890ABCDEF', contentC: encrypt('Ejian111234567890', '1234567890ABCDEF')}).then(response => {
                    console.log(response.data)
                    console.log('=====================aes===================')

                    // npm i crypto-js --save --save-exact
                    // npm install crypto-js
                    var decrypt1 = decrypt(response.data.enc, response.data.key);
                    console.log("後端解密後的數據: ---字符串類型>>> " + decrypt1)

                    var decrypt2 = decrypt(response.data.map, response.data.key);
                    console.log("後端解密後的數據:---集合類型>>> " + decrypt2)

                    var json = JSON.parse(decrypt2);
                    console.log("後端解密後的數據:---集合類型>>>------轉JSON>>> " + json.contentC)

                    console.log('===========test===end===================')
                })
            }
        }
    }
</script>

好了,代碼所有貼出來了, 直接copy就能用, 記得看過點贊, 發個言在走哦!vue

相關文章
相關標籤/搜索