目录
加密技术是信息安全的基石,用于保护敏感数据免遭未授权访问。在 Java 中,AES(Advanced Encryption Standard)、RSA(Rivest-Shamir-Adleman)和 DES(Data Encryption Standard)是三种常用的加密算法。本文将详细介绍这三种加密方案的实现,包括公钥和私钥的生成方法,并比较它们的适用场景。
一、AES 加密与解密
1.1 AES 简介
AES 是对称加密算法,即加密和解密使用同一个密钥。AES 以其速度快和安全性高的特点,被广泛应用于数据传输和存储的加密。
1.2 AES 加密与解密实现
在 Java 中,可以使用 javax.crypto 包中的类来实现 AES 加密与解密。下面是一个简单的示例:
1.2.1 生成 AES 密钥
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class AESKeyGenerator {
public static SecretKey generateKey(int n) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(n);
SecretKey key = keyGen.generateKey();
return key;
}
public static void main(String[] args) throws Exception {
SecretKey key = generateKey(256);
System.out.println("Key: " + bytesToHex(key.getEncoded()));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
1.2.2 AES 加密
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;import java.util.Base64;
public class AESEncryption {
private static final String AES = "AES";
private static final String AES_GCM_NO_PADDING = "AES/GCM/NoPadding";
private static final int GCM_TAG_LENGTH = 16;
public static String encrypt(String plaintext, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);
byte[] iv = new byte[12];
SecureRandom.getInstanceStrong().nextBytes(iv);
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] cipherText = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
byte[] cipherTextWithIv = ByteBuffer.allocate(iv.length + cipherText.length)
.put(iv)
.put(cipherText)
.array();
return Base64.getEncoder().encodeToString(cipherTextWithIv);
}
public static void main(String[] args) throws Exception {
SecretKey key = AESKeyGenerator.generateKey(256);
String encryptedText = encrypt("Hello, World!", key);
System.out.println("Encrypted: " + encryptedText);
}
}
1.2.3 AES 解密
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import java.nio.ByteBuffer;import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AESDecryption {
private static final String AES_GCM_NO_PADDING = "AES/GCM/NoPadding";
private static final int GCM_TAG_LENGTH = 16;
public static String decrypt(String cipherText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(AES_GCM_NO_PADDING);
ByteBuffer byteBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(cipherText));
byte[] iv = new byte[12];
byteBuffer.get(iv);
byte[] cipherTextBytes = new byte[byteBuffer.remaining()];
byteBuffer.get(cipherTextBytes);
GCMParameterSpec spec = new GCMParameterSpec(GCM_TAG_LENGTH * 8, iv);
cipher.init(Cipher.DECRYPT_MODE, key, spec);
byte[] plainText = cipher.doFinal(cipherTextBytes);
return new String(plainText, StandardCharsets.UTF_8);
}
public static void main(String[] args) throws Exception {
SecretKey key = AESKeyGenerator.generateKey(256);
String encryptedText = AESEncryption.encrypt("Hello, World!", key);
String decryptedText = decrypt(encryptedText, key);
System.out.println("Decrypted: " + decryptedText);
}
}
二、RSA 加密与解密
2.1 RSA 简介
RSA 是一种非对称加密算法,使用一对公钥和私钥。公钥用于加密,私钥用于解密。RSA 由于其加密速度较慢,通常用于加密较小的数据或加密对称密钥。
2.2 RSA 加密与解密实现
在 Java 中,可以使用 java.security 和 javax.crypto 包中的类来实现 RSA 加密与解密。
2.2.1 生成 RSA 公钥和私钥
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;
public class RSAKeyGenerator {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
return keyGen.generateKeyPair();
}
public static void main(String[] args) throws Exception {
KeyPair keyPair = generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
System.out.println("Public Key: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
System.out.println("Private Key: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));
}
}
2.2.2 RSA 加密
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.PublicKey;
import java.util.Base64;
public class RSAEncryption {
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 void main(String[] args) throws Exception {
KeyPair keyPair = RSAKeyGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
String encryptedText = encrypt("Hello, World!", publicKey);
System.out.println("Encrypted: " + encryptedText);
}
}
2.2.3 RSA 解密
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.util.Base64;
public class RSADecryption {
public static String decrypt(String cipherText, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
return new String(decryptedBytes, "UTF-8");
}
public static void main(String[] args) throws Exception {
KeyPair keyPair = RSAKeyGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
String encryptedText = RSAEncryption.encrypt("Hello, World!", keyPair.getPublic());
String decryptedText = decrypt(encryptedText, privateKey);
System.out.println("Decrypted: " + decryptedText);
}
}
三、DES 加密与解密
3.1 DES 简介
DES 是一种对称加密算法,即加密和解密使用同一个密钥。尽管其安全性已被认为不够强,但由于其简单性,仍然在一些特定场景下使用。
3.2 DES 加密与解密实现
在 Java 中,可以使用 javax.crypto 包中的类来实现 DES 加密与解密。
3.2.1 生成 DES 密钥
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class DESKeyGenerator {
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56); // DES 使用 56 位密钥
return keyGen.generateKey();
}
public static void main(String[] args) throws Exception {
SecretKey key = generateKey();
System.out.println("Key: " + bytesToHex(key.getEncoded()));
}
private static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
}
3.2.2 DES 加密
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import java.util.Base64;
public class DESEncryption {
public static String encrypt(String plaintext, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static void main(String[] args) throws Exception {
SecretKey key = DESKeyGenerator.generateKey();
String encryptedText = encrypt("Hello, World!", key);
System.out.println("Encrypted: " + encryptedText);
}
}
3.2.3 DES 解密
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import java.util.Base64;
public class DESDecryption {
public static String decrypt(String cipherText, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
return new String(decryptedBytes, "UTF-8");
}
public static void main(String[] args) throws Exception {
SecretKey key = DESKeyGenerator.generateKey();
String encryptedText = DESEncryption.encrypt("Hello, World!", key);
String decryptedText = decrypt(encryptedText, key);
System.out.println("Decrypted: " + decryptedText);
}
}
四、AES、RSA 和 DES 加密方式的适用场景评价
4.1 AES
优点:
- 高效:AES 的加密和解密速度非常快。
- 安全性高:使用 128、192 或 256 位密钥,难以被破解。
- 适合大数据量的加密。
缺点:
- 需要安全地管理和传输密钥。
适用场景:
- 大量数据的加密,如文件加密、数据库加密和网络传输加密。
4.2 RSA
优点:
- 非对称加密:公钥加密,私钥解密,方便密钥分发。
- 高安全性:适用于保护敏感信息。
缺点:
- 加密和解密速度慢,不适合大数据量加密。
- 公钥和私钥的管理复杂。
适用场景:
- 小数据量的加密,如数字签名、证书、密钥交换。
4.3 DES
优点:
- 简单:算法简单易实现。
- 适用于资源受限的环境。
缺点:
- 安全性低:密钥长度仅 56 位,容易被暴力破解。
- 已被更强的算法(如 AES)取代。
适用场景:
- 低安全性要求的场景,或需要兼容旧系统的场合。
4.4 总结
- AES:适用于高效加密大量数据,具有高安全性。
- RSA:适用于高安全性要求的小数据量加密和密钥交换。
- DES:尽管过时,但在某些特定环境下仍可使用。
根据具体需求选择合适的加密算法,确保数据的安全性和系统的性能。