文章目录AES 概述AES 的工作原理块加密密钥长度操作模式AES 的加解密流程AES 的优缺点优点缺点Java 中的 AES 实现Python 中的 AES 实现AES 概述高级加密标准Advanced Encryption Standard简称 AES是美国国家标准与技术研究院NIST于 2001 年发布的一种对称加密算法。它被设计为替代传统的 DESData Encryption Standard以解决其密钥长度过短和安全性不足的问题。AES 是一种基于分组的加密算法支持 128 位、192 位和 256 位的密钥长度广泛应用于无线通信、银行交易、云存储等场景。AES 的工作原理块加密AES 是一种分组密码每次处理固定大小的数据块128 位 16 字节。如果输入数据不足 128 位则需要填充如 PKCS5/7 填充。密钥长度AES 支持 3 种密钥长度AES-128密钥长度为 128 位。AES-192密钥长度为 192 位。AES-256密钥长度为 256 位。密钥长度越长加密的强度越高但同时也会增加计算开销。操作模式AES 常用的操作模式包括ECBElectronic Codebook每个块独立加密容易遭受模式分析攻击不推荐使用。CBCCipher Block Chaining每个块依赖前一个块的加密结果需要初始化向量IV。CFBCipher Feedback加密过程基于流式处理适合逐字节加密。OFBOutput Feedback生成伪随机数流用于加密可有效防止错误传播。CTRCounter使用计数器加密每次加密独立支持并行处理。AES 的加解密流程初始密钥加法将明文与初始密钥进行 XOR 运算。多轮迭代Nr 轮字节代换SubBytes使用 S-box 对数据进行非线性替换。行移位ShiftRows循环左移数据的每一行。列混淆MixColumns将数据按列混淆以增加扩散效果解密时反向操作。轮密钥加法AddRoundKey将当前密钥与数据 XOR。最后一轮与普通轮次类似但省略了列混淆。AES 的优缺点优点高效AES 采用迭代设计算法效率高。安全AES 的设计使其能抵抗已知的密码分析攻击。灵活支持多种密钥长度和操作模式适用范围广。缺点密钥管理复杂对称加密要求发送方和接收方共享密钥密钥分发较困难。不适合处理长消息需要结合操作模式分块处理。Java 中的 AES 实现importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importjava.util.Base64;publicclassAESExample{publicstaticvoidmain(String[]args)throwsException{StringdataHello, AES!;// 生成密钥KeyGeneratorkeyGenKeyGenerator.getInstance(AES);keyGen.init(128);// 密钥长度SecretKeysecretKeykeyGen.generateKey();byte[]keyBytessecretKey.getEncoded();// 加密CiphercipherCipher.getInstance(AES/ECB/PKCS5Padding);cipher.init(Cipher.ENCRYPT_MODE,newSecretKeySpec(keyBytes,AES));byte[]encryptedcipher.doFinal(data.getBytes());System.out.println(Encrypted: Base64.getEncoder().encodeToString(encrypted));// 解密cipher.init(Cipher.DECRYPT_MODE,newSecretKeySpec(keyBytes,AES));byte[]decryptedcipher.doFinal(encrypted);System.out.println(Decrypted: newString(decrypted));}}Python 中的 AES 实现fromCrypto.CipherimportAESfromCrypto.Randomimportget_random_bytesimportbase64defpad(data):# PKCS7 填充pad_len16-len(data)%16returndatabytes([pad_len]*pad_len)defunpad(data):# 去掉填充returndata[:-data[-1]]# 加密keyget_random_bytes(16)# 128 位密钥cipherAES.new(key,AES.MODE_ECB)datapad(bHello, AES!)encryptedcipher.encrypt(data)print(Encrypted:,base64.b64encode(encrypted).decode())# 解密cipherAES.new(key,AES.MODE_ECB)decryptedunpad(cipher.decrypt(encrypted))print(Decrypted:,decrypted.decode())