Java实现常用加密算法 —— AES

系列文章目录


 


目录

系列文章目录

前言

二、实现步骤

1、加密

2、解密

三、测试

总结


前言

      本篇主要介绍AES算法在Java(JDK1.8)中如何实现,借助Java标准库或第三方库,非原始实现,较为基础。


一、AES是什么?

  密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一 。

—— 百度百科

二、实现步骤

1、加密

代码如下(示例):

public class EncryptUtils {
    /**
     * AES,Advanced Encryption Standard,即高级数据加密标准。
     * <p>
     * 输入:待加密的字符串,16或24或32位字符串密码
     * 输出:16进制字符串或Base64编码的字符串密文(常用)
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★★★☆
     *
     * @param plainString 明文
     * @param key         秘钥
     * @return cipherString 密文
     */
    public static String aesEncrypt(String plainString, String key) {
        String cipherString = null;
        try {
            // 指定算法
            String algorithm = "AES";
            // 创建密钥规范
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
            // 获取Cipher对象实例(Java8中AES默认使用ECB模式和PKCS5Padding填充方式,因此下列模式和填充方式无需指定)
            Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
            // 初始化Cipher为加密模式
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            // 获取加密byte数组
            byte[] cipherBytes = cipher.doFinal(plainString.getBytes(StandardCharsets.UTF_8));
            // 输出为Base64编码
            cipherString = Base64.getEncoder().encodeToString(cipherBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return cipherString;
    }
}

2、解密

代码如下(示例):

public class EncryptUtils {
    /**
     * AES,Advanced Encryption Standard,即高级数据加密标准。
     * <p>
     * 输入:密文,16或24或32位字符串密码
     * 输出:明文
     * 应用:密码管理、数字签名、文件完整性校验
     * 安全性:★★★★☆
     *
     * @param cipherString 密文
     * @param key          秘钥
     * @return plainString 明文
     */
    public static String aesDecrypt(String cipherString, String key) {
        String plainString = null;
        try {
            // 指定算法
            String algorithm = "AES";
            // 创建密钥规范
            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm);
            // 获取Cipher对象实例(Java8中AES默认使用ECB模式和PKCS5Padding填充方式,因此下列模式和填充方式无需指定)
            Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
            // 初始化Cipher为解密模式
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            // 获取加密byte数组
            byte[] cipherBytes = cipher.doFinal(Base64.getDecoder().decode(cipherString));
            // 输出为字符串
            plainString = new String(cipherBytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return plainString;
    }
}

三、测试

代码如下:示例

public class EncryptUtils {
    ...
 
    public static void main(String[] args) {
        String plainString = "hello world, hello java!";
        String aesEncrypt = aesEncrypt(plainString, "1234567812345678");
        String aesDecrypt = aesDecrypt(aesEncrypt, "1234567812345678");
        System.out.println("--------------------------- aes");
        System.out.println("加密前: " + plainString);
        System.out.println("加密后: " + aesEncrypt);
        System.out.println("解密后: " + aesDecrypt);
    }
}

运行截图

某网站运行截图


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了AES加密算法在Java中的实现方式,各个加密算法的对比及总结请见本文系列文章汇总篇,水平有限,难免出错,仅供参考,不喜勿喷,感谢!更多内容请百度和ChatGPT!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值