Java文字加密解密:从基础到实践
Java文字加密解密:从基础到实践
在信息安全领域,文字加密解密是一项基础而重要的技术。Java作为一门广泛使用的编程语言,提供了丰富的加密库支持。无论是保护用户密码、传输敏感数据,还是实现数字签名,掌握Java中的加密解密技术都是开发者必备的技能。
一、加密解密的基本概念
加密是将明文转换成密文的过程,而解密则是将密文还原为明文。根据密钥的使用方式,加密算法可分为对称加密和非对称加密两大类。
- 对称加密:使用同一个密钥进行加密和解密。优点:速度快;缺点:密钥分发困难。常见算法:AES、DES、3DES。
- 非对称加密:使用一对密钥(公钥和私钥),公钥加密,私钥解密。优点:安全性高;缺点:速度较慢。常见算法:RSA、ECC。
二、Java中的加密库:JCA与JCE
Java提供了Java Cryptography Architecture (JCA) 和 Java Cryptography Extension (JCE) 用于加密操作。JCA定义了加密服务的接口和引擎,而JCE提供了具体实现。注意,在JDK中默认包含了JCA/JCE,但某些算法可能需要安装额外的权限策略文件(特别是旧版本JDK)。
三、对称加密实战:AES加密解密文字
AES(Advanced Encryption Standard)是目前最流行的对称加密算法,支持128、192、256位密钥。以下是一个完整的AES加密解密示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AESUtil {
// 生成密钥
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // 密钥长度
return keyGen.generateKey();
}
// 加密
public static String encrypt(String plainText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
// 解密
public static String decrypt(String encryptedText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
public static void main(String[] args) throws Exception {
String originalText = "Hello, 世界!";
SecretKey key = generateKey();
String encrypted = encrypt(originalText, key);
String decrypted = decrypt(encrypted, key);
System.out.println("原文: " + originalText);
System.out.println("密文: " + encrypted);
System.out.println("解密: " + decrypted);
}
}
注意:在JDK中,AES 256位密钥可能需要安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files(JDK 8及之前版本),JDK 9+默认支持。
四、非对称加密实战:RSA加密解密文字
RSA算法基于大整数分解的数学难题,广泛用于密钥交换和数字签名。以下是一个简单的RSA加密解密示例:
import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;
public class RSAUtil {
// 生成密钥对
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048);
return generator.generateKeyPair();
}
// 公钥加密
public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
// 私钥解密
public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
return new String(decryptedBytes, "UTF-8");
}
public static void main(String[] args) throws Exception {
String originalText = "RSA加密测试";
KeyPair keyPair = generateKeyPair();
String encrypted = encrypt(originalText, keyPair.getPublic());
String decrypted = decrypt(encrypted, keyPair.getPrivate());
System.out.println("原文: " + originalText);
System.out.println("密文: " + encrypted);
System.out.println("解密: " + decrypted);
}
}
RSA加密数据长度有限制(取决于密钥长度),通常用于加密对称密钥或少量数据。
五、实际应用场景与注意事项
- 密码存储:应使用哈希算法(如SHA-256)加盐,而非可逆加密。
- 数据传输:建议使用对称加密加密数据,非对称加密加密对称密钥(如HTTPS中的TLS)。
- 编码问题:密文通常使用Base64编码传输,注意字符编码一致性。
- 密钥管理:密钥需安全存储,可使用密钥库(KeyStore)或硬件安全模块(HSM)。
六、总结
本文介绍了Java中文字加密解密的核心概念和常用算法,提供了AES和RSA的完整代码示例。实际开发中,应根据安全需求、性能要求以及合规性选择合适的加密方案。加密解密技术是构建安全系统的基石,深入理解并正确应用至关重要。