python实现aes密钥拓展
时间: 2023-07-07 21:45:39 浏览: 358
在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位密钥,则需要生成更多的轮密钥。
AES解密算法的密钥拓展
AES解密算法的密钥拓展是指在AES解密过程中,对密钥进行扩展以生成轮密钥。在AES解密算法中,密钥拓展是通过对原始密钥进行一系列的操作来生成轮密钥。这些操作包括字节代换、行移位、列混合和轮密钥加。密钥拓展的目的是为了生成每一轮加密中所需的轮密钥,以便进行解密操作。通过密钥拓展,可以确保AES解密算法的正确性和安全性。\[1\]
#### 引用[.reference_title]
- *1* *2* *3* [AES加密算法的详细介绍和python实现](https://blog.csdn.net/weixin_49642831/article/details/120805850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文