Python Cryptography Multi Backend无法初始化

标签 python cryptography

Traceback (most recent call last):
  File "ENCDEC.py", line 96, in decrypt
  File "site-packages\cryptography\fernet.py", line 32, in __init__
  File "site-packages\cryptography\hazmat\backends\__init__.py", line 35, in def
ault_backend
  File "site-packages\cryptography\hazmat\backends\multibackend.py", line 33, in
 __init__
ValueError: Multibackend cannot be initialized with no backends. If you are seeing this error when trying to use default_backend() please try uninstalling and reinstalling cryptography.

于是我就做了这个加解密程序,没问题。唯一的问题是它不会构建 .exe。我重新安装,并尝试使用 --onefile。

from PyQt4 import QtCore, QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
import os, sys, getpass, time
from cryptography.fernet import Fernet
from PyQt4 import QtCore, QtGui, uic
import subprocess
from cryptography.hazmat.backends import default_backend
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(795, 603)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 801, 601))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.encrypt = QtGui.QWidget()
        self.encrypt.setObjectName(_fromUtf8("encrypt"))
        self.data = QtGui.QLineEdit(self.encrypt)
        self.data.setGeometry(QtCore.QRect(0, 450, 791, 31))
        self.data.setAccessibleName(_fromUtf8(""))
        self.data.setAutoFillBackground(True)
        self.data.setObjectName(_fromUtf8("data"))
        self.encryptButton = QtGui.QPushButton(self.encrypt)
        self.encryptButton.setGeometry(QtCore.QRect(0, 492, 791, 61))
        self.encryptButton.setObjectName(_fromUtf8("encryptButton"))
        self.cryptDisplay = QtGui.QLineEdit(self.encrypt)
        self.cryptDisplay.setGeometry(QtCore.QRect(12, 420, 371, 20))
        self.cryptDisplay.setReadOnly(True)
        self.cryptDisplay.setObjectName(_fromUtf8("cryptDisplay"))
        self.keyDisplay = QtGui.QLineEdit(self.encrypt)
        self.keyDisplay.setGeometry(QtCore.QRect(422, 420, 361, 20))
        self.keyDisplay.setReadOnly(True)
        self.keyDisplay.setObjectName(_fromUtf8("keyDisplay"))
        self.tabWidget.addTab(self.encrypt, _fromUtf8(""))
        self.Decrypt = QtGui.QWidget()
        self.Decrypt.setObjectName(_fromUtf8("Decrypt"))
        self.decryptButton = QtGui.QPushButton(self.Decrypt)
        self.decryptButton.setGeometry(QtCore.QRect(8, 492, 781, 61))
        self.decryptButton.setObjectName(_fromUtf8("decryptButton"))
        self.input1 = QtGui.QLineEdit(self.Decrypt)
        self.input1.setGeometry(QtCore.QRect(10, 460, 371, 20))
        self.input1.setObjectName(_fromUtf8("input1"))
        self.input2 = QtGui.QLineEdit(self.Decrypt)
        self.input2.setGeometry(QtCore.QRect(420, 460, 361, 20))
        self.input2.setObjectName(_fromUtf8("input2"))
        self.data_2 = QtGui.QLineEdit(self.Decrypt)
        self.data_2.setGeometry(QtCore.QRect(10, 420, 781, 31))
        self.data_2.setAccessibleName(_fromUtf8(""))
        self.data_2.setAutoFillBackground(True)
        self.data_2.setReadOnly(True)
        self.data_2.setObjectName(_fromUtf8("data_2"))
        self.tabWidget.addTab(self.Decrypt, _fromUtf8(""))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.data.setText("MESSAGE")
        self.cryptDisplay.setText("ENCRYPTED MESSAGE")
        self.keyDisplay.setText("DECRYPTION KEY")
        self.input2.setText("DECRYPTION KEY")
        self.input1.setText("ENCRYPTED MESSAGE")
        self.data_2.setText("DECRYPTED MESSAGE")
    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.encryptButton.setText(_translate("MainWindow", "Encrypt", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.encrypt), _translate("MainWindow", "Encrypt", None))
        self.decryptButton.setText(_translate("MainWindow", "Decrypt", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.Decrypt), _translate("MainWindow", "Decrypt", None))
        self.encryptButton.clicked.connect(self.process_input)
        self.decryptButton.clicked.connect(self.decrypt)
    def process_input(self):
        key = Fernet.generate_key()
        cipher_suite = Fernet(key)
        cipher_text = cipher_suite.encrypt(str(self.data.text()))
        print self.data.text()
        print cipher_text
        plain_text = cipher_suite.decrypt(cipher_text)
        self.cryptDisplay.setText(cipher_text)
        self.keyDisplay.setText(str(key))
    def decrypt(self):
        cipher_suite = Fernet(str(self.input2.text()))
        plain_text = cipher_suite.decrypt(str(self.input1.text()))
        self.data_2.setText(str(plain_text))
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我尝试导入默认后端,但不知道我是否正确地做到了这一点。花了几天时间制作,我希望能够与人们分享。不知道现在该做什么,欢迎想法。

最佳答案

我在卡住 Python 脚本时也遇到了同样的问题。我按照此处的建议使用 cryptography.hazmat.backends 的补丁解决了问题 github#issues

    # file: pyenv\lib\site-packages\cryptography\hazmat\backends\__init__.py
def _available_backends():
    global _available_backends_list

    if _available_backends_list is None:
        _available_backends_list = [
            ep.resolve()
            for ep in pkg_resources.iter_entry_points(
                "cryptography.backends"
            )
        ]

    # patch starts here
    if _available_backends_list is None or len(_available_backends_list) == 0:
        # backend 1
        try:
            from cryptography.hazmat.backends.commoncrypto.backend import backend as be_cc
        except ImportError:
            be_cc = None
        # backend 2
        try:
            from cryptography.hazmat.backends.openssl.backend import backend as be_ossl
        except ImportError:
            be_ossl = None
        # add any backends of your own

        _available_backends_list = [
            be for be in (be_cc, be_ossl) if be is not None
        ]
    # patch ends here

    return _available_backends_list

此方法本质上是将后端模块路径硬编码到_available_backends_list。如果您使用的不是上述模块,那么您可以将自己的导入添加到该方法中。 如果这不能解决您的问题,请尝试将整个加密包复制到构建目录。就我而言,我必须将 distutils 包复制到构建目录中,以使其在第一次尝试中工作。

如果成功,您可以尝试将缺少的模块导入包含到 setup.py

关于Python Cryptography Multi Backend无法初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38277915/

相关文章:

用键中的空格替换Python字典

c++ - 非对称认证加密

java - 寻找合适的无限强度文件

python - 在requirements.txt中包含python版本吗?

python - 如何在google colaboratory中导入python文件?

python - 如何使用带有图像的边界框进行多标签图像训练?

python - 如何将 PyGTK 按钮置于前面?

Java 密码和 php mcrypt_encrypt(带 ECB 填充的 BLOWFISH 算法)

javascript - AES 128 解密 : First char of CryptoJS. enc.Latin1 格式错误

apache - 如何使用自定义域在 heroku 上启用完美前向保密?