现代密码学 | 高级加密标准(AES)
接下来我们将讨论目前大多数计算机和硬件基础设施所使用的最重要的加密算法,例如高级加密标准(AES)、里弗斯特-沙米尔-阿德曼算法(RSA)、椭圆曲线加密(ECC)、基于格的加密、(环)带错学习、同态加密。
–
2.2.3.1 高级加密标准 Advanced Encryption Standard(AES)
现代密码学围绕高级加密标准(AES)构建,在数字安全至关重要的时代,它至关重要。AES 旨在取代过时的数据加密标准(DES),如今已成为金融、电信和政府等多个行业数据加密的行业标准。
美国国家标准与技术研究院(NIST)于 2001 年创建了高级加密标准(AES),这是经过全面且竞争激烈的筛选程序的结果。由于数据加密标准(DES)存在弱点,主要是其 56 位的密钥长度相对较小,使其容易受到暴力破解攻击,因此需要一个新的加密标准。1997 年,NIST 发布了新加密标准的征集令,收到了来自世界各地的 15 份响应。比利时密码学家文森特·里杰门(Vincent Rijmen)和琼·达曼(Joan Daemen)创建的 Rijndael 算法经过全面评估后被选中,并被命名为高级加密标准(AES)。
由于 AES 使用对称密钥进行加密,因此加密和解密都需要同一个密钥。它支持 128 位、192 位和 256 位的密钥大小,为抵御可能的入侵提供了强大的保护。AES 的运作基于状态,即一个 4×4 列优先顺序的字节矩阵。该方法通过多轮处理将明文转换为密文,每轮处理都需要若干步骤。
AES 的主要步骤包括:
• 字节替换(SubBytes)。为了使密码具有非线性,使用一个替换盒(S 盒)将状态矩阵中的每个字节替换为不同的字节。
• 行移位(ShiftRows)。通过循环移位状态矩阵的行来实现密码中的扩散。
• 列混合(MixColumns)。为了进一步提高扩散性,通过线性变换将状态矩阵的列组合起来。
• 轮密钥加(AddRoundKey)。使用按位异或将状态矩阵与从主密钥中获得的轮密钥组合起来。
对于 128 位密钥,AES 算法有 10 轮;对于 192 位密钥,有 12 轮;对于 256 位密钥,有 14 轮。轮数随密钥大小而变化。将这两个过程结合起来,保证了 AES 具有强大的安全性和抵御各种加密攻击的能力。
由于其有效性和安全性,AES 经常被用于许多不同的应用中。它是 SSL/TLS 等安全通信协议的组成部分,这些协议保证了互联网上传输的数据的完整性和保密性,并构成了互联网安全的基础。
AES 还用于虚拟专用网络(VPN)中。虚拟专用网络(VPN)用于保护在互联网上远程站点之间传输的数据。高级加密标准(AES)在金融行业中用于保护信用卡处理和网上银行等系统中的敏感数据和交易。
–
Py示例代码,采用CBC模式和PKCS7填充方案(仅供学习参考):
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import osdef aes_encrypt(plaintext: bytes, key: bytes) -> tuple:"""AES加密(CBC模式)"""# 生成随机初始化向量(IV)iv = os.urandom(16)# 设置加密器cipher = Cipher(algorithms.AES(key),modes.CBC(iv),backend=default_backend())encryptor = cipher.encryptor()# 应用PKCS7填充padder = padding.PKCS7(128).padder()padded_data = padder.update(plaintext) + padder.finalize()# 加密数据ciphertext = encryptor.update(padded_data) + encryptor.finalize()return ciphertext, ivdef aes_decrypt(ciphertext: bytes, key: bytes, iv: bytes) -> bytes:"""AES解密(CBC模式)"""# 设置解密器cipher = Cipher(algorithms.AES(key),modes.CBC(iv),backend=default_backend())decryptor = cipher.decryptor()# 解密数据padded_plaintext = decryptor.update(ciphertext) + decryptor.finalize()# 移除PKCS7填充unpadder = padding.PKCS7(128).unpadder()plaintext = unpadder.update(padded_plaintext) + unpadder.finalize()return plaintext# 示例用法
if __name__ == "__main__":# 生成32字节(256位)密钥 - 支持128/192/256位secret_key = os.urandom(32)original_message = b"Hello, Advanced Encryption Standard!"print("原始消息:", original_message.decode())# 加密encrypted_data, iv = aes_encrypt(original_message, secret_key)print("加密结果 (HEX):", encrypted_data.hex())# 解密decrypted_data = aes_decrypt(encrypted_data, secret_key, iv)print("解密消息:", decrypted_data.decode())
运行结果:
关键步骤
1、模逆计算修正:
行列式先转换为正数:det = det % mod
明确验证行列式是否可逆:if np.gcd(det, mod) != 1
正确计算伴随矩阵的符号:[[d, -b], [-c, a]]
2、数据类型强化:
密钥矩阵指定为整数类型:dtype=int
块操作后明确转换为列表:tolist()
3、验证结果:
加密"HELLOWOR"(数字序列:[7,4,11,11,14,22,14,17])
分块加密:
[7,4] × [[7,8],[11,11]] = [77+411, 78+411] = [93, 100] → [93%26=15(H), 100%26=22(W)]
[11,11] → [117+1111, 118+1111] = [198, 209] → [198%26=16(Q), 209%26=1(B)]
正确处理负数和模运算,确保加密/解密过程正确。