python实现aes密钥拓展
时间: 2023-07-07 13:45:39 浏览: 88
在Python中,可以使用pycryptodome库来实现AES密钥扩展。下面是一个简单的示例代码:
```python
from Crypto.Cipher import AES
# 定义原始密钥
key = b'Sixteen byte key'
# 创建AES对象
cipher = AES.new(key, AES.MODE_ECB)
# 获取所有轮密钥
round_keys = [key]
for i in range(10):
round_key = cipher.encrypt(round_keys[-1][:4]) + cipher.encrypt(round_keys[-1][4:8]) + cipher.encrypt(round_keys[-1][8:12]) + cipher.encrypt(round_keys[-1][12:])
round_keys.append(round_key)
# 打印所有轮密钥
for i, rk in enumerate(round_keys):
print(f"Round key {i}: {rk.hex()}")
```
在这个示例代码中,我们使用ECB模式创建了一个AES对象,然后依次生成了所有轮密钥,并打印了每个轮密钥的十六进制表示。请注意,这里我们只生成了10个轮密钥,因为我们使用的是128位密钥,所以只需要10个轮密钥。如果您使用的是192位或256位密钥,则需要生成更多的轮密钥。
相关问题
用python实现密钥拓展
好的,以下是一个基于Python的AES密钥扩展实现示例代码:
```python
from Crypto.Cipher import AES
# 定义原始密钥
key = b'Sixteen byte key'
# 定义密钥扩展算法
def key_expansion(key):
# 定义轮常量
rcon = [
[1, 0, 0, 0], [2, 0, 0, 0], [4, 0, 0, 0], [8, 0, 0, 0],
[16, 0, 0, 0], [32, 0, 0, 0], [64, 0, 0, 0], [128, 0, 0, 0],
[27, 0, 0, 0], [54, 0, 0, 0]
]
# 获取密钥长度
key_len = len(key)
# 计算轮密钥的数量
if key_len == 16:
rounds = 10
nk = 4
elif key_len == 24:
rounds = 12
nk = 6
elif key_len == 32:
rounds = 14
nk = 8
else:
raise ValueError("Invalid key length")
# 初始化轮密钥数组
round_keys = [key[i:i+4] for i in range(0, key_len, 4)]
# 计算并拓展轮密钥
for i in range(nk, 4*(rounds+1)):
temp = round_keys[i-1]
if i % nk == 0:
temp = [temp[1], temp[2], temp[3], temp[0]]
temp = [sbox[x] for x in temp]
temp[0] ^= rcon[i//nk-1][0]
elif nk > 6 and i % nk == 4:
temp = [sbox[x] for x in temp]
temp = [(round_keys[i-nk][j] ^ temp[j]) for j in range(4)]
round_keys.append(temp)
return round_keys
# 创建AES对象
cipher = AES.new(key, AES.MODE_ECB)
# 获取S盒
sbox = list(cipher._cipher.get_sbox())
# 获取所有轮密钥
round_keys = key_expansion(key)
# 打印所有轮密钥
for i, rk in enumerate(round_keys):
print(f"Round key {i}: {rk}")
```
在这个示例代码中,我们定义了一个`key_expansion`函数来进行密钥扩展,该函数接受原始密钥作为输入,返回所有轮密钥。在密钥扩展算法中,我们使用了AES的S盒和轮常量来计算并拓展轮密钥。请注意,这里我们使用了Python中Crypto库中的AES对象来获取S盒。
在主程序中,我们首先创建了一个AES对象,然后使用`key_expansion`函数获取所有轮密钥,并打印了每个轮密钥。请注意,这里我们使用的是128位密钥,所以只需要生成10个轮密钥。如果您使用的是192位或256位密钥,则需要生成更多的轮密钥。
python实现AES
好的,关于Python实现AES,可以使用PyCryptodome库来实现。具体步骤如下:
1. 安装PyCryptodome库:可以使用pip install pycryptodome命令进行安装。
2. 导入Crypto.Cipher模块:使用from Crypto.Cipher import AES命令导入AES模块。
3. 创建AES对象:使用AES.new(key, mode, IV)命令创建AES对象,其中key为密钥,mode为加密模式(如CBC、ECB等),IV为初始化向量。
4. 加密/解密数据:使用encrypt()方法进行加密,使用decrypt()方法进行解密。
下面是一个简单的示例代码:
```python
from Crypto.Cipher import AES
# 加密函数
def encrypt_AES(key, data):
cipher = AES.new(key, AES.MODE_ECB)
return cipher.encrypt(data)
# 解密函数
def decrypt_AES(key, data):
cipher = AES.new(key, AES.MODE_ECB)
return cipher.decrypt(data)
# 测试
key = b'1234567890123456'
data = b'hello world'
encrypted_data = encrypt_AES(key, data)
decrypted_data = decrypt_AES(key, encrypted_data)
print(decrypted_data)
```