2016-07-09 12 views
1
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として試しました。Python暗号Multibackendを初期化できません

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_()) 

私はそれを正しく行ってもデフォルトのバックエンドdunnoをインポートしようとしました。それは作るのに数日を要し、私は人々とそれを共有できるようにしたいと思います。アイデアを開いて、今何をすべきかわからない。

答えて

1

また、Pythonスクリプトをフリーズしているときに、これと同じ問題が発生しました。この方法はbsically _available_backends_listにバックエンドモジュールのパスをハードコードし、ここで 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 

示唆したように私はcryptography.hazmat.backendsにパッチを使用して問題を解決しました。上記のモジュール以外のものを使用している場合は、メソッドに独自のインポートを追加できます。 それでも問題が解決しない場合は、暗号化パッケージ全体をビルドディレクトリにコピーしてみてください。私の場合は、distutilsパッケージもビルドディレクトリにコピーして、最初の試みで動作させる必要がありました。

これがうまくいくと、見つからないモジュールのインポートをsetup.py

に含めることができます
関連する問題