高手请略过,这只是一名小白的学习笔记,没含量。
大名鼎鼎的AES,一直以来只知道个范范,对其细节不甚了解,碰到了也是飘过、绕过。最近因为...,硬着头皮去接触了下...当学习了解后,发现这又是天才的大作,只能膜拜膜拜。
屡屡有这样的场景,某某瞅了一眼张口就来这是某某算法,惊得目瞪只呆,仰慕不已。这次学习研究涉及到了底层,也算是进了一步;我一般是先看代码,大致过一遍,再回过头来看理论的东西,将代码中不明白的地方用理论来指导,效果好。
下面的成文,先从介绍开展,再来代码;我知道大家渴望了解什么,将无关的、易干扰的环节全部抛掉。
一、AES算法中名词
1、概念:AES加密/解密算法是一种可逆的对称加密算法,这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,一般用于服务端对服务端之间对数据进行加密/解密。它是一种为了替代原先DES、3DES而建立的高级加密标准(Advanced Encryption Standard)。
2、有哪些必须知道的要素
以这个为例,
(1)算法模式:有ECB(Electronic Codebook)、CBC(Cipher Block Chaining)、CTR(Counter)、CFB(Cipher Feedback)、OFB(Output Feedback)、GCM(Galois/Counter Mode)等常用模式;
(2)密钥长度:常用的有 128位、256位、512位;
(3)补齐/填充方式:常用的有 PKCS#5/PKCS#7、Zero Padding、ISO Padding等几种;
(4)IV初始化向量:在AES(Advanced Encryption Standard)加密中,IV(Initialization Vector,初始化向量)是一个固定长度的随机数,用于增加密码的安全性。IV的主要目的是确保相同的明文块在不同的加密操作中产生不同的密文块。IV通常与密钥一起使用,并在每个加密操作中都会发生变化。
需要注意的点:
(1)AES是一种块加密算法,意味着它将数据划分为块,并对每个块进行加密;所以才有了补齐方式。
(2)算法模式哪些需要补充/填充模式、初始化向量IV?
A、电子密码本模式 (ECB):
填充:是。由于ECB模式对每个块都使用相同的密钥进行加密,相同的明文块会产生相同的密文块,因此需要填充。
IV:不适用,因为ECB模式不使用IV。
B、密码块链接模式 (CBC):
填充:是。为了保证数据块大小的一致性,需要填充。
IV:是。每个数据块使用前一个密文块进行异或操作,初始块(IV)用于 XOR 操作的第一个块。
C、计数器模式 (CTR):
填充:通常不需要填充。CTR模式将每个块视为一个计数器,而不是使用块之间的依赖性。
IV:是。计数器与密钥相结合,生成一个密钥流,然后与明文进行异或操作。
D、密码反馈模式 (CFB):
填充:是。CFB模式中,前一个密文块的一部分被反馈到加密算法的输入,因此需要填充。
IV:是。初始块(IV)用于 XOR 操作的第一个块。
E、输出反馈模式 (OFB):
填充:是。OFB模式也使用前一个密文块的部分作为输入,因此需要填充。
IV:是。初始块(IV)用于 XOR 操作的第一个块。
(3)输出,一般都是base64或hex;
总结:
补齐(填充)方式:CTR/GCM 不需要;
初始化向量IV:ECB、CTR/GCM 不需要。
二、实例
1、我们以最常用的AES-CBC来举例吧,
我们需要的元素有:算法模式、补齐模式、密钥、密钥长度、IV;
从上面我们可以看出红框,我们来填入后得出:
2、代码举例
这样的例子很多,让GPT写一个py吧
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from Crypto.Util.Padding import pad, unpad
def aes_cbc_encrypt(data, key, iv):
"""
Encrypts data using AES-CBC mode.
Args:
data: The data to encrypt.
key: The encryption key.
iv: The initialization vector.
Returns:
The encrypted data.
"""
# Pad the data to a multiple of 16 bytes.
data = pad(data, AES.block_size)
# Create the AES-CBC cipher object.
cipher = AES.new(key, AES.MODE_CBC, iv)
# Encrypt the data.
encrypted_data = cipher.encrypt(data)
return encrypted_data
def aes_cbc_decrypt(encrypted_data, key, iv):
"""
Decrypts data using AES-CBC mode.
Args:
encrypted_data: The encrypted data.
key: The decryption key.
iv: The initialization vector.
Returns:
The decrypted data.
"""
# Create the AES-CBC cipher object.
cipher = AES.new(key, AES.MODE_CBC, iv)
# Decrypt the data.
decrypted_data = cipher.decrypt(encrypted_data)
# Unpad the data.
decrypted_data = unpad(decrypted_data, AES.block_size)
return decrypted_data
if __name__ == "__main__":
# Generate a random AES key and initialization vector.
key = get_random_bytes(16)
iv = get_random_bytes(16)
# Plaintext to encrypt.
plaintext = b"Hello, world!"
# Encrypt the plaintext.
encrypted_data = aes_cbc_encrypt(plaintext, key, iv)
# Decrypt the ciphertext.
decrypted_data = aes_cbc_decrypt(encrypted_data, key, iv)
# Print the decrypted data.
print(decrypted_data.decode("utf-8"))
代码非常简单,我就没验证了,看着没问题;不过代码里是随机数取key、IV,换成固定的就行。
GPT是个绝好东西,想要什么代码,全部满足,但要调试验证,有时会张冠李戴,如在生成delphi时就发现会有错误,但修改修改就能用,着实省力。
三、AES的底层实现的代码
1、底层有点复杂,AES加密过程包含几个重要步骤,主要有以下四步:
(1)密钥扩展(Key Expansion):根据初始密钥生成一系列轮密钥,以供后续轮次使用。
(2)初始轮(Initial Round):将明文与第一轮密钥进行异或运算。
(3)主轮次(Main Rounds):根据轮数进行一系列迭代,每轮包括SubBytes、ShiftRows、MixColumns和AddRoundKey四个基本变换。
SubBytes:通过一个固定的替代盒(S-Box)替换每个字节。
ShiftRows:对矩阵的行进行循环左移。
MixColumns:对矩阵的列进行线性变换。
AddRoundKey:将轮密钥与矩阵进行按位异或运算。
(4)最终轮(Final Round):在最后一轮中,不包括MixColumns。
解密过程:AES解密过程与加密过程类似,但变换的顺序相反,并且使用逆操作。主要步骤包括逆SubBytes、逆ShiftRows、逆MixColumns和逆AddRoundKey。
可以去B站看看,讲得非常清楚。
2、除了理论外,我还会看它底层的实现代码,如这一段,移位、异或看得我得不知所云,放到GPT上时秒回:这是AES-CBC加密算法。
哎,人类被取代,只是数十年的功夫了。
去年,我在完成上级交办的任务时,逆向了一个程序中发现它使用了“三重DES”加密算法来进行对抗。这次介绍的AES,是比DES更为先进的加密算法,相信以后在黑客程序中都会出现。
原文始发于微信公众号(MicroPest):跟我来学习AES加密算法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论