一、对称加密原理
1. 核心特点
-
单一密钥:加密解密使用相同密钥
-
高效快速:适合大数据量加密
-
密钥分发:主要安全挑战
2. 典型算法:AES(高级加密标准)
加密过程:
-
密钥扩展:将初始密钥扩展为多轮密钥
-
初始轮:AddRoundKey(密钥加)
-
主轮循环(10/12/14轮):
-
SubBytes(字节替换)
-
ShiftRows(行移位)
-
MixColumns(列混淆)
-
AddRoundKey
-
-
最终轮:省略MixColumns
示例代码:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] iv = cipher.getIV(); // 初始化向量
byte[] ciphertext = cipher.doFinal(plaintext.getBytes());
二、非对称加密原理
1. 核心特点
-
密钥对:公钥加密,私钥解密
-
数学难题:基于大数分解(RSA)或离散对数(ECC)
-
速度较慢:适合小数据量加密
2. 典型算法:RSA
密钥生成:
-
选择两个大素数p和q(1024位以上)
-
计算n = p * q
-
计算φ(n) = (p-1)(q-1)
-
选择e(通常65537),满足1 < e < φ(n)且gcd(e, φ(n)) = 1
-
计算d ≡ e⁻¹ mod φ(n)
加密公式:
-
加密:c ≡ mᵉ mod n
-
解密:m ≡ cᵈ mod n
示例代码:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, kp.getPublic());
byte[] ciphertext = cipher.doFinal(plaintext.getBytes());
三、MD5原理(消息摘要算法)
1. 核心特点
-
哈希函数:将任意长度输入→固定长度输出(128位)
-
不可逆:无法从哈希值恢复原文
-
抗碰撞性:已不满足安全要求(已被破解)
2. 算法流程
-
填充消息:
-
添加比特"1"
-
填充0直到长度≡448 mod 512
-
追加64位原始消息长度
-
-
初始化变量:
A = 0x67452301 B = 0xEFCDAB89 C = 0x98BADCFE D = 0x10325476
-
主循环处理(512位分组):
-
每轮16步,共4轮(64步)
-
使用非线性函数(F,G,H,I)
-
每步包含:
-
模加
-
循环左移
-
常量加法
-
-
-
输出哈希值:A,B,C,D的级联
3. 安全缺陷
-
碰撞攻击:可在2¹⁸次操作内找到碰撞
-
实际案例:
-
不同证书生成相同MD5
-
构造恶意文件与正常文件同哈希
-
4. 替代方案
-
安全哈希:SHA-256, SHA-3
-
密码学哈希:BLAKE3, Argon2(带盐)
四、对比总结
特性 | 对称加密 | 非对称加密 | MD5(哈希) |
---|---|---|---|
密钥机制 | 单密钥 | 密钥对 | 无密钥 |
速度 | 快(MB/s级) | 慢(KB/s级) | 快(GB/s级) |
安全性基础 | 混淆扩散 | 数学难题 | 哈希非线性 |
主要用途 | 数据加密 | 密钥交换/签名 | 完整性校验 |
量子安全 | AES-256安全 | 传统算法不安全 | 已不安全 |
五、Java实现示例
1. 对称加密(AES)
// AES-GCM加密
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec ivSpec = new GCMParameterSpec(128, iv); // 12字节IV
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes());
2. 非对称加密(RSA)
// RSA-OAEP加密
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec(
"SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
cipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParams);
3. 哈希计算(SHA-256替代MD5)
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(message.getBytes());
六、安全建议
-
对称加密:
-
使用AES-256-GCM
-
确保IV唯一性(GCM推荐12字节随机数)
-
定期轮换密钥
-
-
非对称加密:
-
RSA至少2048位(3072位更安全)
-
优先选择ECC(如P-256曲线)
-
使用OAEP填充而非PKCS#1 v1.5
-
-
哈希算法:
-
禁用MD5/SHA-1
-
敏感场景加盐(salt)
-
考虑使用HMAC进行密钥哈希
-
理解这些加密原理和哈希机制是构建安全系统的基石,开发者应根据具体场景选择适当算法并正确实现。