加密算法
2025年2月26日大约 5 分钟
加密算法是信息安全领域的重要组成部分,是保护数据机密性、完整性和不可抵赖性的重要工具。该文档总结了常见的加密算法理论、分类以及 Java 的实现代码。
目录
1. 什么是加密算法
加密算法是一种信息安全算法,用于将数据转换为难以理解的形式,保护数据在传输和存储中的机密性、完整性和不可抵赖性。
核心目标
- 机密性:防止未授权方读取数据。
- 完整性:确保数据未被篡改。
- 不可抵赖性:发送方不能否认发送的数据。
常见用途
- 数据传输加密(如 HTTPS 协议)
- 文件系统加密
- 数字签名与认证
2. 加密算法分类
根据密钥使用方式的不同,加密算法可分为以下几类:
加密算法类型 | 描述 | 示例算法 | 使用场景 |
---|---|---|---|
对称加密 | 加密和解密使用相同密钥 | AES、DES | 数据存储与传输 |
非对称加密 | 加密和解密使用不同的密钥(公钥加密,私钥解密,或反之) | RSA、ECC | 密钥交换与身份认证 |
散列算法 | 单向函数,无需解密,主要用于数据完整性验证 | MD5、SHA、HMAC | 密码存储与完整性 |
数字签名 | 利用非对称加密验证信息来源和完整性 | RSA 签名 | 电子合同/文件签名 |
3. 对称加密算法
3.1 AES 加密
原理
AES(高级加密标准)是一种对称加密算法,使用块加密的方式,支持 128、192、256 位密钥长度。
- 输入:明文 + 密钥
- 输出:密文
Java 实现
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESExample {
private static final String ALGORITHM = "AES";
public static String encrypt(String plainText, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String cipherText, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}
public static void main(String[] args) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(128); // 密钥长度 128 位
SecretKey secretKey = keyGenerator.generateKey();
String plainText = "Hello, AES!";
String cipherText = encrypt(plainText, secretKey);
System.out.println("密文: " + cipherText);
String decryptedText = decrypt(cipherText, secretKey);
System.out.println("解密结果: " + decryptedText);
}
}
3.2 DES 加密
原理
- 数据加密标准(DES)是一种块加密算法,使用 56 位密钥。
特点
- 安全性较低(已被淘汰),适合简单场景。
- Java 的实现方式与 AES 类似。
4. 非对称加密算法
4.1 RSA 加密
原理
RSA 使用两个密钥:
- 公钥:公开传播,用于加密。
- 私钥:仅发送方自己持有,用于解密。
特点
- 优点:
- 高安全性,用于密钥交换与身份认证。
- 缺点:
- 计算开销大,不适合大数据量加密。
Java 实现
import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;
public class RSAExample {
private static final String ALGORITHM = "RSA";
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
keyGen.initialize(2048); // 密钥长度
return keyGen.generateKeyPair();
}
public static String encrypt(String plainText, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String cipherText, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes);
}
public static void main(String[] args) throws Exception {
KeyPair keyPair = generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
String plainText = "Hello, RSA!";
String cipherText = encrypt(plainText, publicKey);
System.out.println("密文: " + cipherText);
String decryptedText = decrypt(cipherText, privateKey);
System.out.println("解密结果: " + decryptedText);
}
}
5. 散列算法
5.1 MD5 哈希算法
原理
MD5 是一种单向函数,通常用于验证数据完整性。
Java 实现
import java.security.MessageDigest;
public class MD5Example {
public static String hash(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(input.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b)); // 转为 16 进制
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String input = "Hello, MD5!";
String hashValue = hash(input);
System.out.println("MD5 散列: " + hashValue);
}
}
5.2 SHA 哈希算法
原理
SHA(Secure Hash Algorithm)是一种密码学散列算法,SHA-256 最常用,输出 256 位。
Java 实现
import java.security.MessageDigest;
public class SHAExample {
public static String hash(String input) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = md.digest(input.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : hashBytes) {
sb.append(String.format("%02x", b));
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String input = "Hello, SHA-256!";
String hashValue = hash(input);
System.out.println("SHA-256 散列: " + hashValue);
}
}
6. 数字签名
工作原理
- 通过非对称加密实现,私钥用于签名,公钥用于验证。
使用场景
- 文件或数据的完整性验证。
- 电子合同。
7. 加密算法对比
算法 | 类型 | 安全性 | 使用场景 | 性能 |
---|---|---|---|---|
AES | 对称加密 | 高 | 文件加密、数据传输 | 快速 |
RSA | 非对称加密 | 很高 | 密钥交换、身份验证 | 慢(适合小数据) |
MD5 | 散列算法 | 低(已不推荐) | 数据完整性验证 | 快速 |
SHA-256 | 散列算法 | 高 | 密码哈希 | 较慢 |
8. 总结
本文总结了加密算法的主要分类、实现方式及应用场景。对称加密和非对称加密是实际应用中的核心,而散列算法无解密过程,适合验证完整性。在实际开发中,根据场景选择适合的加密算法至关重要。