首页 > 解决方案 > 无法在 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)))

标签: pythondjangovisual-studio-codevirtualenvpycryptodome

解决方案


将虚拟环境的站点包文件夹中的文件夹“crypto”重命名为“Crypto”解决了该问题。


推荐阅读