python - 无法在 django 中导入 pycryptodome
问题描述
我创建了一个名为dp1的 django-project ,并在其中创建了一个名为da1的 djano-app 。我正在一个名为 testing 的虚拟环境中使用 Windows。
da1\views.py
from django.shortcuts import render
# Create your views here.
from django.http.response import HttpResponse
from django.shortcuts import render
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
import os
class AESCipher(object):
def __init__(self, key):
self.block_size = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(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 decrypt(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) - 1:]
return plain_text[:-ord(last_character)]
# Create your views here.
def home(req):
return render(req,'home.html',{"name":"Manish"})
def add(req):
choice = req.POST['choice'] # value of selected radio button
val1 = req.POST['text1']
val2 = req.POST['text2']
result = choice+val1+val2
key_128 = "kuch bhi"
iv = "InitializationVe"
aesCipher = AESCipher(key_128)
print(aesCipher.key)
sentence = "manish swami"
print(aesCipher.encrypt(sentence))
return render(req, 'result.html' ,{'result': result})
from Crypto.Cipher import AES
我收到一个错误Import "Crypto.Cipher" could not be resolved Pylance (reportMissingImports)
。
我已经在虚拟环境中安装了 pycryptodome 模块,但仍然出现错误。
pycrytodome 包的链接是 → https://www.pycryptodome.org/en/latest/src/installation.html
我尝试执行 test-everything 命令python -m Crypto.SelfTest
,但它只在全球范围内工作。
我在 Global Env 和 Virtual env 中安装了这个包,但在虚拟环境中它不起作用,而在全局环境中它工作正常。
这是全球应用程序:
import hashlib
from Crypto import Random
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
import os
class AESCipher(object):
def __init__(self, key):
self.block_size = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(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 decrypt(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) - 1:]
return plain_text[:-ord(last_character)]
if __name__ == "__main__" :
print("hello")
key_128 = "samplekey"
iv = "InitializationVe"
aesCipher = AESCipher(key_128)
print(aesCipher.key)
sentence = "inputsentence"
print(aesCipher.encrypt(sentence))
print(aesCipher.decrypt(aesCipher.encrypt(sentence)))
解决方案
将虚拟环境的站点包文件夹中的文件夹“crypto”重命名为“Crypto”解决了该问题。
推荐阅读
- javascript - 您如何将拖放列表的代码与 Javascript 中的表单条目输入结合起来?
- macos - 如何解决macOS中VSCode中的includePath错误
- node.js - 如何在节点中打开具有独占文件访问权限的文件?
- python - DataFrame 的真值是模棱两可的。在 Jupyter 中使用 a.empty、a.bool()、a.item()、a.any() 或 a.all() 错误
- html - 使用“将文件另存为...”时,阻止 Chrome 将我的相对链接转换为绝对链接
- node.js - 您在 POST 请求 NodeJS 快速服务器中的哪里看到 console.log 语句?
- java - 如何实现exponentialRampToValueAtTime以在通过websocket写入音频时消除点击声音
- python - 如何从新页面追加行以进行循环
- node.js - 以下图像中显示的以下十六进制代码之间的区别
- rust - 我需要将文件放在哪里以供 Rust 读取?