【问题标题】:unable to import pycryptodome in django无法在 django 中导入 pycryptodome
【发布时间】:2021-08-15 15:25:15
【问题描述】:

我创建了一个名为 dp1 的 django 项目,并在其中创建了一个名为 da1 的 djano 应用程序。 我正在一个名为 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)))

【问题讨论】:

  • 你试过pycrypto包安装吗?
  • @SuyogShimpi ya .. 但由于某种原因它无法正常工作
  • 好像是安装问题,你试过重新安装吗?而'python -m Crypto.SelfTest'命令可以帮你测试它的安装完整性,你试过了吗?

标签: python django visual-studio-code virtualenv pycryptodome


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我使用docker,在需求中添加'pycryptodome==3.11.0'后,然后rebuild,遇到了同样的问题。

    我猜图片有缓存。

    清除历史图像后,解决该错误。

    特此留言分享...

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 2022-01-04
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2018-06-26
    • 2021-07-06
    相关资源
    最近更新 更多