码迷,mamicode.com
首页 > 编程语言 > 详细

Aes 加密解密 java加密解密

时间:2019-09-06 22:38:09      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:tor   padding   tin   ram   ESS   servlet   spec   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就能用, 记得看过点赞, 发个言在走哦!

Aes 加密解密 java加密解密

标签:tor   padding   tin   ram   ESS   servlet   spec   java代码   点赞   

原文地址:https://www.cnblogs.com/eian/p/11478479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!