首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python密码学多后端不能被初始化

Python密码学多后端不能被初始化
EN

Stack Overflow用户
提问于 2016-07-09 03:14:07
回答 1查看 983关注 0票数 1
代码语言:javascript
复制
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。我重新安装了,然后试着.

代码语言:javascript
复制
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_())

我尝试导入默认后端,但不知道是否正确。它花了几天的时间来制作,我希望能和大家分享。现在不知道该做什么,敞开心扉。

EN

回答 1

Stack Overflow用户

发布于 2016-07-09 20:11:02

在冻结Python脚本时,我也面临着同样的问题。我使用cryptography.hazmat.backends的修补程序解决了这个问题,就像这里建议的那样,github#issues

代码语言:javascript
复制
    # 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中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38277915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档