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: **********
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


