修改代码错误ciphertext_id, tag = cipher.encrypt_and_digest(id.encode()) AttributeError: 'int' object has no attribute 'encode'
时间: 2023-12-02 14:01:59 浏览: 150
这个错误是因为你试图将一个整数类型的变量进行编码,而编码通常是应用于字符串类型的。你需要将 id 变量转换为字符串类型,然后再进行编码。一个简单的解决方法是使用 str() 函数,例如:ciphertext_id, tag = cipher.encrypt_and_digest(str(id).encode())。希望能够帮到你!
相关问题
from Crypto.Cipher import DES# 设置密钥key = b'abcdefgh'# 加密函数def des_encrypt(text): cipher = DES.new(key, DES.MODE_ECB) length = DES.block_size count = len(text) if count % length != 0: add = length - (count % length) else: add = 0 text = text + (b'\0' * add) ciphertext = cipher.encrypt(text) return ciphertext# 解密函数def des_decrypt(ciphertext): cipher = DES.new(key, DES.MODE_ECB) text = cipher.decrypt(ciphertext) return text.rstrip(b'\0')# 测试text = b'Hello World'print('原始文本:', text)ciphertext = des_encrypt(text)print('加密后:', ciphertext)plaintext = des_decrypt(ciphertext)print('解密后:', plaintext)
这段代码实现了一个DES算法的加密和解密过程,具体步骤如下:
1. 导入`Crypto.Cipher`模块中的DES加密算法
2. 设置密钥,这里用一个长度为8字节的字符串`abcdefgh`作为密钥
3. 定义加密函数`des_encrypt`,接收明文作为输入,返回密文
4. 在加密函数中,使用DES加密算法创建一个新的加密器对象`cipher`,采用ECB模式
5. 计算明文的长度,并将其填充到8字节的倍数,不足8字节的部分使用`\0`填充
6. 调用加密器对象的`encrypt`方法,对填充后的明文进行加密,得到密文
7. 返回密文
8. 定义解密函数`des_decrypt`,接收密文作为输入,返回明文
9. 在解密函数中,使用相同的密钥和加密模式,创建一个新的解密器对象`cipher`
10. 调用解密器对象的`decrypt`方法,对密文进行解密,得到明文
11. 去除填充部分的`\0`
12. 返回明文
13. 测试算法的正确性,分别输出原始文本、加密后的密文和解密后的明文。
from tkinter import * from crypto.Cipher import DES def encrypt(): key = bytes(key_entry.get(), 'utf-8') cipher = DES.new(key, DES.MODE_ECB) plaintext = bytes(plaintext_entry.get(), 'utf-8') ciphertext = cipher.encrypt(plaintext) ciphertext_entry.delete(0, END) ciphertext_entry.insert(0, ciphertext.hex()) def decrypt(): key = bytes(key_entry.get(), 'utf-8') cipher = DES.new(key, DES.MODE_ECB) ciphertext = bytes.fromhex(ciphertext_entry.get()) plaintext = cipher.decrypt(ciphertext) plaintext_entry.delete(0, END) plaintext_entry.insert(0, plaintext.decode('utf-8')) root = Tk() plaintext_label = Label(root, text="Plaintext:") plaintext_label.grid(row=0, column=0) plaintext_entry = Entry(root) plaintext_entry.grid(row=0, column=1) key_label = Label(root, text="Key:") key_label.grid(row=1, column=0) key_entry = Entry(root) key_entry.grid(row=1, column=1) encrypt_button = Button(root, text="Encrypt",command=encrypt) encrypt_button.grid(row=2, column=0) decrypt_button = Button(root, text="Decrypt",command=decrypt) decrypt_button.grid(row=2, column=1) ciphertext_label = Label(root, text="Ciphertext:") ciphertext_label.grid(row=3, column=0) ciphertext_entry = Entry(root) ciphertext_entry.grid(row=3, column=1) root.mainloop()
这段代码存在一个问题:在函数 `encrypt()` 中,程序尝试使用一个名为 `plaintext_entry` 的变量,但是该变量在函数外部并没有定义,导致程序无法识别该变量,进而报错。同样的问题也出现在函数 `decrypt()` 中。
为了修复这个问题,你需要将 `plaintext_entry` 定义为全局变量,这样它就可以被所有函数访问。你可以将 `plaintext_entry` 的定义放在 `root` 的创建之前,或者在函数 `encrypt()` 和 `decrypt()` 中声明 `plaintext_entry` 为全局变量。修改后的代码如下所示:
```python
from tkinter import *
from crypto.Cipher import DES
plaintext_entry = None # 将 plaintext_entry 定义为全局变量
def encrypt():
global plaintext_entry # 声明 plaintext_entry 为全局变量
key = bytes(key_entry.get(), 'utf-8')
cipher = DES.new(key, DES.MODE_ECB)
plaintext = bytes(plaintext_entry.get(), 'utf-8')
ciphertext = cipher.encrypt(plaintext)
ciphertext_entry.delete(0, END)
ciphertext_entry.insert(0, ciphertext.hex())
def decrypt():
global plaintext_entry # 声明 plaintext_entry 为全局变量
key = bytes(key_entry.get(), 'utf-8')
cipher = DES.new(key, DES.MODE_ECB)
ciphertext = bytes.fromhex(ciphertext_entry.get())
plaintext = cipher.decrypt(ciphertext)
plaintext_entry.delete(0, END)
plaintext_entry.insert(0, plaintext.decode('utf-8'))
root = Tk()
# 定义 plaintext_entry
plaintext_label = Label(root, text="Plaintext:")
plaintext_label.grid(row=0, column=0)
plaintext_entry = Entry(root)
plaintext_entry.grid(row=0, column=1)
# 其他代码保持不变
```
这样修改之后,程序就能够正确运行了。
阅读全文