Cipher简介说明
下文笔者讲述"Cipher简介"说明,如下所示
Cipher简介
`Cipher`是Java中加密架构(Java Cryptography Architecture, JCA)中一个核心类, 其功能:用于加密和解密数据 `Cipher`类 提供多种加密算法和模式支持, 使得开发者可以方便地实现数据的安全传输和存储
`Cipher`类详细介绍
`Cipher`类位于`javax.crypto` 包中 可提供以下功能: -加密:将明文数据转换为密文数据。 -解密:将密文数据转换为明文数据。 -多种算法:支持多种加密算法 如 AES、DES、RSA 等。 -多种模式:支持多种加密模式 如 ECB、CBC、GCM 等。 -填充方式:支持多种填充方式 如 PKCS5Padding、PKCS7Padding 等。
`Cipher`类中主要方法
-`getInstance(String transformation)`: - 获取 `Cipher` 实例,指定加密算法、模式和填充方式。 - 例如:`Cipher.getInstance("AES/CBC/PKCS5Padding")`。 -`init(int opmode, Key key)`: - 初始化 `Cipher` 实例,指定操作模式(加密或解密)和密钥。 - 例如:`cipher.init(Cipher.ENCRYPT_MODE, secretKey)`。 -`init(int opmode, Key key, AlgorithmParameterSpec params)`: - 初始化 `Cipher` 实例,指定操作模式、密钥和算法参数。 - 例如:`cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec)`。 -`update(byte[] input)`: - 对输入数据进行部分加密或解密操作。 - 适用于大数据量的加密和解密。 -`doFinal(byte[] input)`: - 对输入数据进行最终的加密或解密操作。 - 适用于小数据量的加密和解密。 -`doFinal(byte[] input, int inputOffset, int inputLen)`: - 对输入数据的一部分进行最终的加密或解密操作。
Cipher加密模式
`Cipher` 类支持多种加密模式,常见的模式包括: -ECB (Electronic Codebook): - 每个数据块独立加密。 - 不需要初始化向量(IV)。 - 不适合加密大数据量,容易被攻击。 -CBC (Cipher Block Chaining): - 每个数据块与前一个数据块的加密结果进行异或后再加密。 - 需要初始化向量(IV)。 - 更安全,适合加密大数据量。 - GCM (Galois/Counter Mode): - 结合了 CBC 和 CTR 模式的优点。 - 提供了认证加密功能。 - 需要初始化向量(IV)和认证标签(Authentication Tag)。 填充方式 填充方式用于确保数据块的长度符合加密算法的要求。常见的填充方式包括: -NoPadding: - 不进行填充。 - 数据长度必须是加密算法块大小的整数倍。 -PKCS5Padding: - 使用 PKCS#5 标准进行填充。 - 填充字节的值等于填充字节数。 -PKCS7Padding: - 使用 PKCS#7 标准进行填充。 - 类似于 PKCS5Padding,但支持更大的块大小。例
使用`Cipher`类 进行 AES 加密和解密 import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import java.util.Base64; public class CipherExample { private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; public static void main(String[] args) { try { // 生成密钥 SecretKey secretKey = generateKey(128); // 生成初始化向量 (IV) byte[] iv = new byte[16]; // AES 块大小为 16 字节 IvParameterSpec ivSpec = new IvParameterSpec(iv); // 明文数据 String plainText = "Hello, World!"; System.out.println("Original Text: " + plainText); // 加密 String encryptedText = encrypt(plainText, secretKey, ivSpec); System.out.println("Encrypted Text: " + encryptedText); // 解密 String decryptedText = decrypt(encryptedText, secretKey, ivSpec); System.out.println("Decrypted Text: " + decryptedText); } catch (Exception e) { e.printStackTrace(); } } // 生成密钥 public static SecretKey generateKey(int n) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); keyGenerator.init(n); return keyGenerator.generateKey(); } // 加密 public static String encrypt(String plainText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes()); return Base64.getEncoder().encodeToString(encryptedBytes); } // 解密 public static String decrypt(String encryptedText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); byte[] decodedBytes = Base64.getDecoder().decode(encryptedText); byte[] decryptedBytes = cipher.doFinal(decodedBytes); return new String(decryptedBytes); } }
代码说明
1.生成密钥 public static SecretKey generateKey(int n) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM); keyGenerator.init(n); return keyGenerator.generateKey(); } - KeyGenerator:用于生成密钥。 -init(n): 初始化密钥生成器, 指定密钥长度(128、192、256 位) 2.生成初始化向量 (IV) byte[] iv = new byte[16]; // AES 块大小为 16 字节 IvParameterSpec ivSpec = new IvParameterSpec(iv); -IV: 初始化向量,用于 CBC 模式。 -IvParameterSpec: 用于指定 IV。 3.加密 public static String encrypt(String plainText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes()); return Base64.getEncoder().encodeToString(encryptedBytes); } -Cipher.getInstance(TRANSFORMATION): 获取 `Cipher` 实例,指定加密算法、模式和填充方式。 -cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec): 初始化 `Cipher` 实例为加密模式。 -cipher.doFinal(plainText.getBytes()): 执行加密操作。 -Base64 编码: 将加密后的字节数组编码为字符串,便于存储和传输。 4.解密 public static String decrypt(String encryptedText, SecretKey secretKey, IvParameterSpec ivSpec) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); byte[] decodedBytes = Base64.getDecoder().decode(encryptedText); byte[] decryptedBytes = cipher.doFinal(decodedBytes); return new String(decryptedBytes); } -Cipher.getInstance(TRANSFORMATION):获取 `Cipher` 实例,指定加密算法、模式和填充方式。 -cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec):初始化 `Cipher` 实例为解密模式。 -Base64 解码:将编码后的字符串解码为字节数组。 -cipher.doFinal(decodedBytes):执行解密操作。
运行以上代码,将输出以下信息 Original Text: Hello, World! Encrypted Text: **********
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。