1、定义与核心原理
- 定义:加密和解密使用相同密钥的算法。
- 工作流程:
- 秘钥协商:双方需提前通过安全信道共享密钥。
- 加密过程:发送方用密钥对明文加密,生成密文。
- 解密过程:接收方用相同密钥对密文解密,还原明文。
- 关键点:密钥的安全性是加密系统的核心,一旦密钥泄露,所有加密数据将暴露。
2、特点
- 优点:
- 速度快:算法计算量小,适合加密大量数据。
- 高效:加密和解密效率高,资源消耗低。
- 成熟技术:算法公开且经过长期验证(如 AES、DES)。
- 缺点:
- 密钥分发问题:双方需提前安全共享密钥,密钥管理复杂。
- 秘钥管理安全性差:若密钥泄露,所有通信内容可被破解。
- 扩展性差:在分布式系统中,用户数量增加会导致密钥数量呈几何级增长(如n个用户需n(n-1)/2个密钥)。
3、常见算法分类
(1)、DES(Data Encryption Standard)(不推荐)
基本信息:
- 提出时间:1977年由NIST标准化。
- 密钥长度:64位(实际有效56位,每8位包含奇偶校验位)。
- 分组长度:64位(将明文分组为64位块处理)。
- 轮数:16轮加密。
特点:
- 优点:早期广泛使用,算法简单。
- 缺点:
- 密钥长度过短(56位),易受暴力破解(如1998年被破解)。
- 现已 不推荐使用,仅用于遗留系统。
应用场景:
- 历史用途:金融、政府系统(如ATM、旧版SSL)。
- 替代方案:被3DES和AES取代。
(2)、3DES(Triple DES)(不推荐)
基本信息:
- 改进自:DES的三重加密变体。
- 密钥长度:168位(3个独立56位密钥),或112位(2个密钥)。
- 加密方式:执行三次DES加密(如加密-解密-加密)。
特点:
- 优点:
- 提升了DES的安全性,抵抗差分攻击。
- 向后兼容DES,可在旧系统中使用。
- 缺点:
- 速度较慢(三倍DES计算量)。
- 现逐渐被 AES取代。
应用场景:
- 过渡方案:旧系统升级时的临时选择。
- 金融领域:部分ATM和支付系统。
(3)、AES(Advanced Encryption Standard)(推荐)
基本信息:
- 提出时间:2001年由NIST标准化。
- 密钥长度:128位、192位、256位(安全性随位数提升)。
- 分组长度:128位(固定)。
- 轮数:10-14轮(根据密钥长度不同)。
特点:
- 优点:
- 安全性高:无已知有效破解方法。
- 效率高:软件和硬件实现均高效。
- 广泛支持:成为 国际标准(替代DES)。
- 缺点:
- 需管理不同密钥长度的密钥。
应用场景:
- 主流标准:SSL/TLS、HTTPS、IPSec。
- 政府与军事:敏感数据加密。
- 区块链:部分协议使用AES加密交易数据。
(4)、Blowfish
基本信息:
- 提出时间:1993年由Bruce Schneier设计。
- 密钥长度:可变(32位到448位)。
- 分组长度:64位。
特点:
- 优点:
- 免费无专利:开源且无使用限制。
- 灵活密钥长度:适应不同安全需求。
- 缺点:
- 分组较短(64位),安全性低于AES。
应用场景:
- 轻量级设备:嵌入式系统、密码管理器(如KeePass)。
(5)、IDEA(International Data Encryption Algorithm)
基本信息:
- 提出时间:1991年。
- 密钥长度:128位。
- 分组长度:64位。
特点:
- 优点:
- 强加密强度,无已知有效攻击。
- 曾用于PGP(Pretty Good Privacy)。
- 缺点:
- 专利限制(已过期)。
- 分组较短,逐渐被AES取代。
应用场景:
- 历史应用:早期PGP和SSL/TLS。
分类对比:
4、对称加密的工作模式
对称加密算法通常需要结合 工作模式 来处理实际数据(如分组加密、流加密等)。
常见模式包括:
(1)、ECB(电子密码本模式)
- 原理:每个明文块独立加密,使用相同密钥。
- 特点:
- 简单但不安全:相同明文块生成相同密文块,易被分析。
- 无初始向量(IV)需求。
(2)、CBC(密文分组链接模式)
- 原理:当前密文块依赖前一个密文块,需初始向量(IV)。
- 特点:
- 安全性较高,防止重复明文块。
- 需要IV,但IV无需保密。
(3)、CTR(计数器模式)
- 原理:将密钥与计数器值加密生成“密钥流”,异或明文。
- 特点:
- 可并行处理,适合高速加密。
- 需要唯一计数器值,避免重复。
(4)、GCM(伽罗瓦计数器模式)
- 原理:结合CTR模式和认证码(Galois哈希)。
- 特点:
- 提供加密与认证(AEAD,如AES-GCM)。
- 高效且安全,现代推荐模式。
5、应用场景
(1)、数据存储
- 数据库加密:AES加密敏感字段。
- 文件加密:如BitLocker(Windows)、FileVault(macOS)。
(2)、通信加密 - TLS/SSL:协商密钥后使用AES加密数据。
- VoIP:实时语音通话加密(如ZRTP协议)。
(3)、物联网(IoT) - 低功耗设备:使用轻量级算法(如AES-CTR)。
(4)、典型应用: - 非对称+对称结合:用RSA交换AES密钥,再用AES加密数据(如HTTPS)。
- 本地文件加密(如 ZIP 压缩包加密)。
6、示例代码(AES示例)
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.util.Base64;public class AESExample {public static void main(String[] args) throws Exception {String originalText = "Sensitive Data";System.out.println("Original Text: " + originalText);// 生成AES密钥SecretKey secretKey = generateAESKey();// 加密String encryptedText = encrypt(originalText, secretKey);System.out.println("Encrypted Text: " + encryptedText);// 解密String decryptedText = decrypt(encryptedText, secretKey);System.out.println("Decrypted Text: " + decryptedText);}// 生成秘钥private static SecretKey generateAESKey() throws Exception {KeyGenerator keyGen = KeyGenerator.getInstance("AES");keyGen.init(256); // 256-bit keyreturn keyGen.generateKey();}// 加密private static String encrypt(String plainText, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 使用CBC模式和PKCS5填充cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] iv = cipher.getIV(); // 初始化向量 (IV)byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());return Base64.getEncoder().encodeToString(iv) + ":" + Base64.getEncoder().encodeToString(encryptedBytes);}// 解密private static String decrypt(String encryptedText, SecretKey secretKey) throws Exception {String[] parts = encryptedText.split(":");byte[] iv = Base64.getDecoder().decode(parts[0]);byte[] encryptedBytes = Base64.getDecoder().decode(parts[1]);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secretKey, new javax.crypto.spec.IvParameterSpec(iv));byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}
}
解释:
- 密钥生成:使用KeyGenerator生成AES密钥,长度为256位。
- 加密模式:使用CBC模式(推荐),并提供初始化向量(IV)以增强安全性。
- 填充方式:使用PKCS5Padding填充,确保数据块符合AES的要求(128位块大小)。
- Base64编码:将加密后的字节数组转换为字符串以便存储或传输。
逆风翻盘,Dare To Be!!!