import binascii from Crypto.Cipher import AES # 密钥,长度必须是16、24或32字节(128、192或256位) key = b'secret_key_123456' # 初始化密码算法 cipher = AES.new(key, AES.MODE_ECB) # 待加密的消息,长度必须是16的倍数 message = b'Hello World 1234' # 加密 msg_encrypted = cipher.encrypt(message) print("加密后的消息:", binascii.hexlify(msg_encrypted)) # 解密 msg_decrypted = cipher.decrypt(msg_encrypted) print("解密后的消息:", msg_decrypted.decode())这段代码报错import binascii from Crypto.Cipher import AES # 密钥,长度必须是16、24或32字节(128、192或256位) key = b'secret_key_123456' # 初始化密码算法 cipher = AES.new(key, AES.MODE_ECB) # 待加密的消息,长度必须是16的倍数 message = b'Hello World 1234' # 加密 msg_encrypted = cipher.encrypt(message) print("加密后的消息:", binascii.hexlify(msg_encrypted)) # 解密 msg_decrypted = cipher.decrypt(msg_encrypted) print("解密后的消息:", msg_decrypted.decode())
时间: 2024-03-01 11:49:46 浏览: 76
这个代码需要依赖`pycryptodome`库或者`pycrypto`库。如果您没有安装这些库,可以通过以下命令安装:
使用`pycryptodome`库:
```
pip install pycryptodome
```
使用`pycrypto`库:
```
pip install pycrypto
```
安装完成后,再次运行代码应该就不会报错了。
相关问题
from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex #ECB模式 class aestest(): #***********Begin************** #************End*************** def Evidence(text,key): # 要求key长度为16 aes = aestest(key) enc = aes.encrypt(text) print(enc) detext = aes.decrypt(enc) print(detext)
这段代码实现了AES加密算法的ECB模式。其中,aestest类封装了AES加密和解密的方法,key为加密密钥,text为待加密的明文。在调用Evidence函数时,会先创建一个aestest的实例,然后调用该实例的encrypt方法对明文进行加密,接着输出加密后的密文,再调用该实例的decrypt方法对密文进行解密,最后输出解密后的明文。需要注意的是,这里的key长度必须为16字节。
出现TypeError: 'int' object is not subscriptable ,如何改进pycharm实现AES子密钥生成算法完整代码
好的,以下是一个简单的示例代码,可以在 Pycharm 中实现 AES 子密钥生成算法,并避免出现“'int' object is not subscriptable”错误:
```
# 导入所需的库
from Crypto.Cipher import AES
import binascii
# 定义一个函数来生成 AES 子密钥
def generate_subkeys(key):
# 将密钥转换为字节类型
key_bytes = key.encode('utf-8')
# 创建一个 AES 对象
aes = AES.new(key_bytes, AES.MODE_ECB)
# 计算子密钥的数量
num_subkeys = (len(key_bytes) // 4) + 6
# 初始化 subkeys 列表
subkeys = []
# 将原始密钥添加到 subkeys 列表
subkeys.append(key_bytes)
# 生成子密钥
for i in range(1, num_subkeys):
# 获取前一个子密钥
prev_key = subkeys[i-1]
# 计算新的子密钥
if i % 4 == 0:
# 对前一个子密钥进行逐字节的左移操作
prev_key = bytearray(prev_key)
prev_key.append(prev_key.pop(0))
prev_key = bytes(prev_key)
# 对前一个子密钥进行 S 盒替换
new_key = []
for byte in prev_key:
new_byte = AES_S_BOX[byte]
new_key.append(new_byte)
# 对新的子密钥进行异或操作
new_key[0] ^= R_CON[i // 4]
else:
new_key = []
for j in range(4):
new_byte = prev_key[j] ^ subkeys[i-4][j]
new_key.append(new_byte)
# 将新的子密钥添加到 subkeys 列表中
subkeys.append(bytes(new_key))
# 返回子密钥列表
return subkeys
# 测试生成子密钥函数
if __name__ == '__main__':
key = 'This is a secret key'
subkeys = generate_subkeys(key)
for i, subkey in enumerate(subkeys):
print(f'Subkey {i}: {binascii.hexlify(subkey).decode("utf-8")}')
```
在上面的代码中,我们首先定义了一个名为 generate_subkeys 的函数,该函数接受一个字符串类型的密钥,并返回一个包含所有子密钥的列表。然后,我们在主函数中调用 generate_subkeys 函数,并打印出所有子密钥的十六进制表示。
请注意,该代码仅是一个示例,您需要根据您的具体需求进行修改。另外,请确保您已经安装了 PyCryptodome 库,该库提供了 AES 算法的实现。
阅读全文