赞
踩
AES(Advanced Encryption Standard)加密是一种广泛使用的对称加密算法,它使用相同的密钥进行加密和解密操作。在AES加密中,key(密钥) 和 iv(初始化向量,Initialization Vector)是两个重要的组成部分。
在AES加密过程中,首先会将明文分成多个128位的数据块(如果最后一个数据块不足128位,则需要进行填充)。然后,使用密钥和iv对数据进行加密。加密过程通常包括多个轮次,每轮都会执行一系列复杂的操作,如字节替换、行移位、列混合和轮密钥加等。最终,所有的数据块都被加密成密文。
在Java中,使用AES加密时,需要指定一个密钥(key)和一个初始化向量(IV)。Java的javax.crypto包提供了进行AES加密和解密所需的类和接口。以下是一个简单的Java示例,展示了如何使用AES加密算法、密钥(key)和初始化向量(IV)来加密字符串。
首先,确保已经导入了必要的包:
import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.SecureRandom; import java.util.Base64; public class AESEncryptionExample { public static void main(String[] args) throws Exception { // 原始字符串 String originalString = "Hello, AES Encryption!"; // 生成密钥 SecretKey key = generateKey(); // 生成IV byte[] iv = generateIv(); // 加密 String encryptedString = encrypt(originalString, key, iv); // 输出加密后的字符串(这里使用Base64编码以便于显示和传输) System.out.println("Encrypted String: " + encryptedString); // 解密(这里仅作为示例,实际使用时应确保解密方也能获取到正确的key和iv) String decryptedString = decrypt(encryptedString, key, iv); // 输出解密后的原始字符串 System.out.println("Decrypted String: " + decryptedString); } // 生成AES密钥 private static SecretKey generateKey() throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); // 可以是128, 192, 或 256 return keyGenerator.generateKey(); } // 生成随机的IV private static byte[] generateIv() { byte[] iv = new byte[16]; // AES block size new SecureRandom().nextBytes(iv); return iv; } // 使用AES加密字符串 private static String encrypt(String data, SecretKey key, byte[] iv) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, key, ivParameterSpec); byte[] encrypted = cipher.doFinal(data.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(encrypted); } // 使用AES解密字符串 private static String decrypt(String encryptedData, SecretKey key, byte[] iv) throws Exception { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, key, ivParameterSpec); byte[] original = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); return new String(original, "UTF-8"); } }
在这个示例中,首先生成了一个AES密钥和一个随机的IV。然后,使用这些密钥和IV来加密一个字符串,并将加密后的数据使用Base64编码以便于显示和传输。最后,还展示了如何使用相同的密钥和IV来解密加密后的数据。
请注意,在实际应用中,需要确保加密方和解密方都能获取到相同的密钥和IV。密钥通常是通过安全的密钥交换协议来分发的,而IV可以随加密数据一起发送(因为IV不需要保密)。然而,出于安全考虑,应该确保IV的随机性,并避免使用可预测的IV值。
此外,示例中使用了AES/CBC/PKCS5Padding作为Cipher的转换字符串。这表示使用的是AES加密算法,CBC作为操作模式(Cipher Block Chaining),以及PKCS5Padding作为填充机制。这些是AES加密中常用的选项,但也可以根据具体需求选择其他选项。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。