加密模块和加密方法不起作用
Crypto module and Encryption method not working
基本上,我的问题分为两个问题,首先,当我尝试 运行 这段代码 [下面的代码] 并得到一个错误时,我遇到了这个问题,如下所示:
ImportError Traceback (most recent call last)
<ipython-input-3-3d0c04910b61> in <module>
1 import hashlib
----> 2 from crypto import Random
3 from crypto.Cipher import AES
4 from base64 import b64encode, b64decode
5
ImportError: cannot import name 'Random' from 'crypto' (C:\Users\Ahmad\anaconda3\lib\site-packages\crypto\__init__.py)
第二个问题是当我输入文本时,即:“我的数据在这里”我得到的加密文本是:“ GIdd+zxj8m0nMeh7wmZJ+Q==" 但在解密过程中反转它会输出不同的文本,以验证我正在使用的过程并通过 https://aesencryption.net/ 检查作为我工作中的参考.
我的代码:
import hashlib
from crypto import Random
from crypto.Cipher import AES
from base64 import b64encode, b64decode
class AESCipher(object):
def __init__(self, key):
self.block_size = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encryption(self, plain_text):
plain_text = self.__pad(plain_text)
iv = Random.new().read(self.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
encrypted_text = cipher.encrypt(plain_text.encode())
return b64encode(iv + encrypted_text).decode("utf-8")
def decryption(self, encrypted_text):
encrypted_text = b64decode(encrypted_text)
iv = encrypted_text[:self.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
plain_text = cipher.decrypt(encrypted_text[self.block_size:]).decode("utf-8")
return self.__unpad(plain_text)
def __pad(self, plain_text):
number_of_bytes_to_pad = self.block_size - len(plain_text) % self.block_size
ascii_string = chr(number_of_bytes_to_pad)
padding_str = number_of_bytes_to_pad ** ascii_string
padded_plain_text = plain_text + padding_str
return padded_plain_text
@staticmethod
def __unpad(plain_text):
last_character = plain_text[len(plain_text) - 2:]
return plain_text[:-ord(last_character)]
在__pad()
方法中**
被*
代替:
padding_str = number_of_bytes_to_pad * ascii_string
在 __unpad()
方法中,填充大小由 last 字节决定:
last_character = plain_text[len(plain_text) - 1:]
通过这些更改,代码可以通过 PyCryptodome, see also here 成功执行安装。
不需要显式实现填充。 PyCryptodome 在专用模块 (Crypto.Util.Padding
) 中支持各种填充(包括 PKCS7)。
请注意,从带有摘要的密码中导出密钥通常是不安全的。使用可靠的密钥推导函数,如 Argon2 或 PBKDF2 更安全。
基本上,我的问题分为两个问题,首先,当我尝试 运行 这段代码 [下面的代码] 并得到一个错误时,我遇到了这个问题,如下所示:
ImportError Traceback (most recent call last)
<ipython-input-3-3d0c04910b61> in <module>
1 import hashlib
----> 2 from crypto import Random
3 from crypto.Cipher import AES
4 from base64 import b64encode, b64decode
5
ImportError: cannot import name 'Random' from 'crypto' (C:\Users\Ahmad\anaconda3\lib\site-packages\crypto\__init__.py)
第二个问题是当我输入文本时,即:“我的数据在这里”我得到的加密文本是:“ GIdd+zxj8m0nMeh7wmZJ+Q==" 但在解密过程中反转它会输出不同的文本,以验证我正在使用的过程并通过 https://aesencryption.net/ 检查作为我工作中的参考.
我的代码:
import hashlib
from crypto import Random
from crypto.Cipher import AES
from base64 import b64encode, b64decode
class AESCipher(object):
def __init__(self, key):
self.block_size = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encryption(self, plain_text):
plain_text = self.__pad(plain_text)
iv = Random.new().read(self.block_size)
cipher = AES.new(self.key, AES.MODE_CBC, iv)
encrypted_text = cipher.encrypt(plain_text.encode())
return b64encode(iv + encrypted_text).decode("utf-8")
def decryption(self, encrypted_text):
encrypted_text = b64decode(encrypted_text)
iv = encrypted_text[:self.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
plain_text = cipher.decrypt(encrypted_text[self.block_size:]).decode("utf-8")
return self.__unpad(plain_text)
def __pad(self, plain_text):
number_of_bytes_to_pad = self.block_size - len(plain_text) % self.block_size
ascii_string = chr(number_of_bytes_to_pad)
padding_str = number_of_bytes_to_pad ** ascii_string
padded_plain_text = plain_text + padding_str
return padded_plain_text
@staticmethod
def __unpad(plain_text):
last_character = plain_text[len(plain_text) - 2:]
return plain_text[:-ord(last_character)]
在__pad()
方法中**
被*
代替:
padding_str = number_of_bytes_to_pad * ascii_string
在 __unpad()
方法中,填充大小由 last 字节决定:
last_character = plain_text[len(plain_text) - 1:]
通过这些更改,代码可以通过 PyCryptodome, see also here 成功执行安装。
不需要显式实现填充。 PyCryptodome 在专用模块 (Crypto.Util.Padding
) 中支持各种填充(包括 PKCS7)。
请注意,从带有摘要的密码中导出密钥通常是不安全的。使用可靠的密钥推导函数,如 Argon2 或 PBKDF2 更安全。