系列文章目录
目录
前言
本篇主要介绍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!