Java轻松的AES加密解密工具

1、背景

在开发过程中,设置公用第三方可调用接口,如果通过http发起请求,参数等会是明文的方式,这里为了防止被爆破开放接口,我这里采用了明文加密传输的方式。

2、AES是什么

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

那么为什么原来的DES会被取代呢,,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。完善的加密算法在理论上是无法破解的,除非使用穷尽法。使用穷尽法破解密钥长度在128位以上的加密数据是不现实的,仅存在理论上的可能性。统计显示,即使使用目前世界上运算速度最快的计算机,穷尽128位密钥也要花上几十亿年的时间,更不用说去破解采用256位密钥长度的AES算法了。

目前世界上还有组织在研究如何攻破AES这堵坚厚的墙,但是因为破解时间太长,AES得到保障,但是所用的时间不断缩小。随着计算机计算速度的增快,新算法的出现,AES遭到的攻击只会越来越猛烈,不会停止的。

AES现在广泛用于金融财务、在线交易、无线通信、数字存储等领域,经受了最严格的考验,但说不定哪天就会步DES的后尘。

3、代码加测试

已解决传输过程中中文乱码的情况,如果有出现 "+"无法接收的情况,在加密串种把 + 号转为%2B ,其他符号如果传输无法接收,可以转为对应的16进制编码格式,在进行传输。

public class AESUtils {

    public static final String AES_KEY = "edFabJn3ZA==7JVk";//密钥自定义16位

    /**
     * AES加密+Base64转码
     *
     * @param data 明文(16进制)
     * @return
     */
    public static String encrypt(String data) {
        byte[] keyb = null;
        try {
            keyb = AES_KEY.getBytes("utf-8");
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } // 明文
        SecretKeySpec sKeySpec = new SecretKeySpec(keyb, "AES");
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance("AES");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        byte[] bjiamihou = null;
        String miwen = "";
        try {
            bjiamihou = cipher.doFinal(data.getBytes("utf-8"));
            // byte加密后
            miwen = Base64.encodeBase64String(bjiamihou);// 密文用base64加密
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        }

        return miwen;
    }

    /**
     * Base64解码 + AES解码
     *
     * @param data 密文 (16进制)
     * @return
     */
    public static String decrypt(String data){
        byte[] keyb = null;
        try {
            keyb = AES_KEY.getBytes("utf-8");
        } catch (UnsupportedEncodingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        byte[] miwen = Base64.decodeBase64(data);
        SecretKeySpec sKeySpec = new SecretKeySpec(keyb, "AES");
        Cipher cipher = null;
        try {
            cipher = Cipher.getInstance("AES");
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            cipher.init(Cipher.DECRYPT_MODE, sKeySpec);
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        byte[] bjiemihou = null;
        String mingwen = "";
        try {
            bjiemihou = cipher.doFinal(miwen);
            // byte加密后
            mingwen = new String(bjiemihou,"utf-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mingwen;
    }

    public static void main(String[] args) throws Exception {
        // 测试加密工具类
        String data = "{\"appCode\":\"portal\",\"createtime\":1592981430336,\"msgContent\":\"这里是通知的正文\",\"msgSignature\":\"中心(Janson)\",\"msgStatus\":0,\"msgTitle\":\"测试通知任务\",\"msgType\":1,\"objectCreateTime\":1592981430322,\"objectId\":\"123123123Id\",\"permission\":0,\"receiveUsers\":\"450503\",\"sendObject\":1,\"status\":0,\"userType\":1}";//明文
        String miwen = encrypt(data);// 加密
        System.out.println(miwen);
        System.out.println(decrypt(miwen));// 解密

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值