AES加密算法实现 Java版

什么是AES加密算法?

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

AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。完善的加密算法在理论上是无法破解的,除非使用穷尽法。使用穷尽法破解密钥长度在128位以上的加密数据是不现实的,仅存在理论上的可能性。统计显示,即使使用目前世界上运算速度最快的计算机,穷尽128位密钥也要花上几十亿年的时间,更不用说去破解采用256位密钥长度的AES算法了。

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

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

AES结构

AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
AES-1284410
AES-1926412
AES-2568414

如何使用?

密钥K
密钥K
明文P
AES加密算法
密文T
网络传输
AES解密算法
明文P
生成AES对称密钥
/**
     * 生成AES密钥
     *
     * @return Keys.Aes
     * @throws NoSuchAlgorithmException
     */
    public static Keys.Aes genKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM);
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();
        Keys.Aes aes = new Keys().new Aes(Tools.encodeToString(secretKey.getEncoded()));
        return aes;
    }
AES加密
/**
     * AES 私钥加密
     *
     * @param str
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static String encrypt(String str, String privateKey) throws Exception {
        //base64编码的私钥
        byte[] keyBytes = Tools.decode(privateKey);
        Key key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
        //AES加密
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, key);
        String outStr = Tools.encodeToString(cipher.doFinal(str.getBytes(Charsets.UTF_8)));
        return outStr;
    }
AES解密
/**
     * AES 私钥解密
     *
     * @param str
     * @param privateKey
     * @return
     * @throws Exception
     */
    public static String decrypt(String str, String privateKey) throws Exception {
        //base64编码的私钥
        byte[] keyBytes = Tools.decode(privateKey);
        Key key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
        //AES解密
        Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, key);
        //64位解码加密后的字符串
        byte[] inputByte = Tools.decode(str.getBytes(Charsets.UTF_8));
        return new String(cipher.doFinal(inputByte));
    }
Test测试
import com.alibaba.fastjson.JSON;
import com.pnoker.common.bean.encryp.Keys;
import com.pnoker.common.utils.encryp.AesTools;
import com.pnoker.common.utils.encryp.RsaTools;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * <p>Copyright(c) 2018. Pnoker All Rights Reserved.
 * <p>Author     : Pnoker
 * <p>Email      : pnokers@gmail.com
 * <p>Description: AES\RSA 加密算法测试
 */
@Slf4j
public class TestEncrypt {
    @Test
    public void aesTest() throws Exception {
        Keys.Aes aes = AesTools.genKey();
        log.info(" aes key : {}", JSON.toJSONString(aes));
        String str = "nihao@ks.pnoker.cn,nihao@ks.pnoker.cn";
        log.info("str : {}", str);
        String ens = AesTools.encrypt(str, aes.getPrivateKey());
        log.info("ens : {}", ens);
        String des = AesTools.decrypt(ens, aes.getPrivateKey());
        log.info("des : {}", des);
    }

    @Test
    public void rsaTest() throws Exception {
        Keys.Rsa rsa = RsaTools.genKey();
        log.info(" rsa key : {}", JSON.toJSONString(rsa));
        String str = "nihao@ks.pnoker.cn,nihao@ks.pnoker.cn";
        log.info("str : {}", str);
        String ens = RsaTools.encrypt(str, rsa.getPublicKey());
        log.info("ens : {}", ens);
        String des = RsaTools.decrypt(ens, rsa.getPrivateKey());
        log.info("des : {}", des);
    }
}

Base64工具类
import com.google.common.base.Charsets;

import java.util.Base64;

/**
 * <p>Copyright(c) 2018. Pnoker All Rights Reserved.
 * <p>Author     : Pnoker
 * <p>Email      : pnokers@gmail.com
 * <p>Description: 工具类
 */
public class Tools {
    /**
     * 将字符串进行Base64编码
     *
     * @param str
     * @return 返回字节流
     */
    public static byte[] encode(String str) {
        byte[] bytes = Base64.getEncoder().encode(str.getBytes(Charsets.UTF_8));
        return bytes;
    }

    /**
     * 将字节流进行Base64编码
     *
     * @param bytes
     * @return 返回字符串
     */
    public static String encodeToString(byte[] bytes) {
        String str = Base64.getEncoder().encodeToString(bytes);
        return str;
    }

    /**
     * 必须配合encode使用,用于encode编码之后解码
     *
     * @param str 字符串
     * @return 返回字节流
     */
    public static byte[] decode(String str) {
        byte[] bytes = Base64.getDecoder().decode(str);
        return bytes;
    }

    /**
     * 必须配合encode使用,用于encode编码之后解码
     *
     * @param input 字节流
     * @return 返回字节流
     */
    public static byte[] decode(byte[] input) {
        byte[] bytes = Base64.getDecoder().decode(input);
        return bytes;
    }
}

实体封装类

import lombok.AllArgsConstructor;
import lombok.Data;

/**
 * <p>Copyright(c) 2018. Pnoker All Rights Reserved.
 * <p>Author     : Pnoker
 * <p>Email      : pnokers@gmail.com
 * <p>Description: AES & RSA 算法密钥实体类
 */
public class Keys {

    /**
     * RSA 密钥对
     */
    @Data
    @AllArgsConstructor
    public class Rsa {
        private String publicKey;
        private String privateKey;
    }

    /**
     * Aes 密钥
     */
    @Data
    @AllArgsConstructor
    public class Aes {
        private String privateKey;
    }
}

完整例子推荐

IOT应用实例下载 AES/RSA算法


项目推荐



DC3是基于Spring Cloud的开源可分布式物联网(IOT)平台,用于快速开发、部署物联设备接入项目,是一整套物联系统解决方案。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值