介绍
AES(高级加密标准,Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由比利时密码学家Vincent Rijmen和Joan Daemen设计,他们设计的算法最初被称为Rijndael。AES于2001年被美国国家标准与技术研究院(NIST)选为官方的加密标准,用以取代旧的DES标准。
以下是AES算法的一些关键特性:
- 对称密钥:AES是一种对称密钥加密算法,这意味着加密和解密过程使用相同的密钥。
- 密钥长度:AES支持三种密钥长度,分别是128位、192位和256位,分别对应AES-128、AES-192和AES-256。
- 块大小:AES使用固定大小的块加密数据,块大小为128位。
- 安全性:AES被认为是非常安全的加密算法,目前没有已知的有效的攻击方法可以快速破解AES加密。
- 性能:AES算法设计时考虑了性能,它在多种硬件和软件平台上都能高效运行。
- 模式:AES可以与不同的工作模式结合使用,以适应不同的安全需求。常见的工作模式包括ECB(电子密码本模式)、CBC(密码块链接模式)、CTR(计数器模式)等。
- 填充:由于AES是块加密算法,它需要处理固定大小的数据块。如果数据不是块大小的整数倍,就需要使用填充(padding)机制来确保数据能够被正确加密。常见的填充方式包括PKCS#7和零填充。
- 应用广泛:AES被广泛应用于各种安全领域,包括无线通信、安全协议、文件加密等。
- 实现:AES算法的实现可以在软件和硬件中找到,许多编程语言和库都提供了AES加密的实现。
AES算法的加密和解密过程都包括多个轮次的变换,每一轮都涉及一系列复杂的操作,如字节代换(Substitution)、行移位(ShiftRow)、列混淆(MixColumn)和轮密钥加(AddRoundKey)。在最后一轮中,除了AddRoundKey之外,不包括MixColumn步骤。由于AES的高安全性和效率,它已成为全球范围内加密通信和数据保护的首选算法之一。
Java实现AES加解密
public class AesUtil {
/**
* 加密/解密算法名称
*/
private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* 秘钥算法
*/
private static final String KEY_ALGORITHM = "AES";
/**
* 数据加密: 明文 -> 密文
*/
public static String encrypt(String plainString, String key, String ivs) {
try {
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKey secKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secKey, new IvParameterSpec(ivs.getBytes()));
// 加密数据, 返回密文,使用base64编码密文byte数组,返回密文字符串
return new String(Base64.getEncoder().encode(cipher.doFinal(plainString.getBytes(StandardCharsets.UTF_8))));
} catch (InvalidAlgorithmParameterException | NoSuchPaddingException | IllegalBlockSizeException |
NoSuchAlgorithmException | BadPaddingException | InvalidKeyException e) {
throw new RuntimeException(e);
}
}
/**
* 数据解密: 密文 -> 明文
*/
public static String decrypt(String cipherString, String key, String ivs) {
try {
Cipher cipher = Cipher.getInstance(ALGORITHM);
SecretKey secKey = new SecretKeySpec(key.getBytes(), KEY_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secKey, new IvParameterSpec(ivs.getBytes()));
// 解密数据, 返回明文,对base64编码的密文解码成密文byte数组,再使用AES解码
byte[] plainBytes = cipher.doFinal(Base64.getDecoder().decode(cipherString));
return new String(plainBytes);
} catch (InvalidAlgorithmParameterException | IllegalBlockSizeException | NoSuchPaddingException |
NoSuchAlgorithmException | BadPaddingException | InvalidKeyException e) {
throw new RuntimeException(e);
}
}
}
标签:AES,加密,String,算法,密文,new
From: https://www.cnblogs.com/jiayuan2006/p/18316460