Java Cipher 简介
Java Cipher 是 Java 加密标准库中的一个类,用于实现各种密码算法的加密和解码操作。
加密防止内容被泄露 ;签名防止内容被篡改。
常用
非对称加密 RSA、DSA;对称加密 AES、DES
非对称加密
Cipher 支持的非对称加密类型
非对称加密算法都可以在 Java 的 Cipher 类中通过指定相应的算法名称来使用。例如,使用 Cipher.getInstance("RSA") 可以获取一个用于 RSA 加密和解密的 Cipher 对象。
注意
:每种非对称加密算法可能还有不同的工作模式和填充方式可供选择,在使用 Cipher 进行非对称加密时,也需要根据具体需求进行相应的设置。
◯ RSA:RSA(Rivest-Shamir-Adleman) 是一种基于大数因子分解的非对称加密算法。最常用的非对称加密算法之一,加密解密数据,生成和验证数据签名。
◯ DSA:DSA(Digital Signature Algorithm) 用于生成和验证数字签名的非对称加密算法。验证数据的完整性和身份认证。
◯ ECIES:ECIES(Elliptic Curve Integrated Encryption Scheme) 基于椭圆曲线密码学的非对称加密算法。
◯ Elgamal:Elgamal 是一种基于离散对数问题的非对称加密算法。它可以用于加密和解密数据以及生成和验证数字签名。
Cipher 支持的对称加密类型
注意
:具体可用的对称加密算法取决于 Java 运行时环境的配置,不同的 Java 版本和供应商可能支持不同的算法。可通过调用 Cipher.getMaxAllowedKeyLength() 方法来查看支持的最大密钥长度。 此外,为了确保数据的安全性,建议使用具有强大安全性和广泛接受的加密算法,如 AES 。同时,也要正确处理密钥管理、加密模式和填充方式等方面的问题。
AES(高级加密标准)
DES(数据加密标准)
3DES(Triple DES,即DESede)
Blowfish
RC2(Rivest Cipher 2)
RC4(Rivest Cipher 4)
RC5(Rivest Cipher 5)
创建 Cipher 对象:调用 Cipher.getInstance(String transformation) 方法并传入对应的转换名称,创建 Cipher 对象。转换名称包含:密码算法、工作模式和填充模式。如:"/AES/ECB/PKCS5Padding" 表示使用 AES 算法、ECB 工作模式和 PKCS5 填充方式
初始化 Cipher:调用 Cipher.init(int opmode, Key key) 方法,初始化 Cipher 对象。
执行加密/解密操作:调用 Cipher.doFinal(byte[] input) 方法,执行实际的加密或者解密操作。input 参数是要处理的输入数据,返回值是经过加密或解密后的结果。
对称加密 AES
AES/ECB/PKCS5Padding
不推荐 AES/ECB 组合使用
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class CipherExample {
public static void main(String[] args) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
String plainText = "Hello, World!";
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedText = cipher.doFinal(plainText.getBytes());
System.out.println("加密后的数据:" + new String(encryptedText));
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedText = cipher.doFinal(encryptedText);
System.out.println("解密后的数据:" + new String(decryptedText));
AES/CBC/PKCS5Padding
推荐 AES/CBC
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AesCbcDemo {
public static void main(String[] args) throws Exception {
String plaintext = "Hello, world!";
String secretKey = "0123456789abcdef";
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");
Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] ivBytes = new byte[encryptCipher.getBlockSize()];
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
decryptCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] encryptedBytes = encryptCipher.doFinal(plaintext.getBytes("UTF-8"));
String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("加密后:" + encryptedText);
byte[] decryptedBytes = decryptCipher.doFinal(Base64.getDecoder().decode(encryptedText));
String decryptedText = new String(decryptedBytes, "UTF-8");
System.out.println("解密后:" + decryptedText);
非对称加密 RSA
RSA/CBC 一般 RSA 不与 CBC 组合使用,而与 ECB 组合
import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("publicKey: " + publicKey);
System.out.println("privateKey: " + privateKey);
String plainText = "Hello, World!";
Cipher encryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = encryptCipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
System.out.println("加密后的数据:" + new String(encryptedBytes));
Cipher decryptCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = decryptCipher.doFinal(encryptedBytes);
System.out.println("解密后的数据:" + new String(decryptedBytes));
java开发
粉丝