2017-10-05 149 views
0

我試圖構建一個使用pycryptodome下面的腳本:如何使用pycryptodome pyinstaller建立可執行文件?

# based on this example http://www.codekoala.com/posts/aes-encryption-python-using-pycrypto/#comment-25921785 
from Crypto.Cipher import AES 
from Crypto import Random 
import base64 

plain_text = 'Secret data' 
block_size = 16 
key_size = 32 
mode = AES.MODE_CBC 

key_bytes = Random.get_random_bytes(key_size) 
pad = block_size - len(plain_text) % block_size 
data = plain_text + pad * chr(pad) 
iv_bytes = Random.get_random_bytes(block_size) 
encrypted_bytes = iv_bytes + AES.new(key_bytes, mode, iv_bytes).encrypt(bytes(data, encoding='utf-8')) 

encrypted_string = base64.urlsafe_b64encode(encrypted_bytes) 
key_string = base64.urlsafe_b64encode(key_bytes) 

key_bytes2 = base64.urlsafe_b64decode(key_string) 
assert key_bytes == key_bytes2 

encrypted_bytes2 = base64.urlsafe_b64decode(encrypted_string) 
assert encrypted_bytes == encrypted_bytes2 

iv_bytes2 = encrypted_bytes2[:block_size] 
assert iv_bytes == iv_bytes2 

encrypted_bytes2 = encrypted_bytes2[block_size:] 
plain_text2 = AES.new(key_bytes2, mode, iv_bytes2).decrypt(encrypted_bytes2) 
print(plain_text2) 
pad = int(plain_text2[-1]) 
print(pad) 
plain_text2 = plain_text2[:-pad].decode('utf-8') 
print(plain_text2) 
assert plain_text == plain_text2 

這是輸出我得到的,同時運行pyinstaller:

C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec>pyinstaller crypto.py 
46 INFO: PyInstaller: 3.3 
46 INFO: Python: 3.6.2 
46 INFO: Platform: Windows-7-6.1.7601-SP1 
46 INFO: wrote C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\crypto.spec 
46 INFO: UPX is not available. 
62 INFO: Extending PYTHONPATH with paths 
['C:\\Users\\test\\Documents\\MiniCryptoCodec\\minicryptocodec', 
'C:\\Users\\test\\Documents\\MiniCryptoCodec\\minicryptocodec'] 
62 INFO: checking Analysis 
62 INFO: Building Analysis because out00-Analysis.toc is non existent 
62 INFO: Initializing module dependency graph... 
62 INFO: Initializing module graph hooks... 
62 INFO: Analyzing base_library.zip ... 
2718 INFO: running Analysis out00-Analysis.toc 
2718 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable 
    required by c:\users\test\appdata\local\programs\python\python36\python.exe 
3281 INFO: Caching module hooks... 
3281 INFO: Analyzing C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\crypto.py 
3625 INFO: Loading module hooks... 
3625 INFO: Loading module hook "hook-encodings.py"... 
3703 INFO: Loading module hook "hook-pydoc.py"... 
3703 INFO: Loading module hook "hook-xml.py"... 
3921 INFO: Looking for ctypes DLLs 
3921 INFO: Analyzing run-time hooks ... 
3921 INFO: Looking for dynamic libraries 
4000 INFO: Looking for eggs 
4000 INFO: Using Python library c:\users\test\appdata\local\programs\python\python36\python36.dll 
4000 INFO: Found binding redirects: 
[] 
4015 INFO: Warnings written to C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\build\crypto\warncrypto.txt 
4062 INFO: Graph cross-reference written to C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\build\crypto\xref-crypto.html 
4062 INFO: checking PYZ 
4062 INFO: Building PYZ because out00-PYZ.toc is non existent 
4062 INFO: Building PYZ (ZlibArchive) C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\build\crypto\out00-PYZ.pyz 
4515 INFO: Building PYZ (ZlibArchive) C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\build\crypto\out00-PYZ.pyz completed successfully. 
4515 INFO: checking PKG 
4515 INFO: Building PKG because out00-PKG.toc is non existent 
4515 INFO: Building PKG (CArchive) out00-PKG.pkg 
4531 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully. 
4531 INFO: Bootloader c:\users\test\appdata\local\programs\python\python36\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe 
4531 INFO: checking EXE 
4531 INFO: Building EXE because out00-EXE.toc is non existent 
4531 INFO: Building EXE from out00-EXE.toc 
4531 INFO: Appending archive to EXE C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec\build\crypto\crypto.exe 
4546 INFO: Building EXE from out00-EXE.toc completed successfully. 
4546 INFO: checking COLLECT 
4546 INFO: Building COLLECT because out00-COLLECT.toc is non existent 
4546 INFO: Building COLLECT out00-COLLECT.toc 
4875 INFO: Building COLLECT out00-COLLECT.toc completed successfully. 

似乎一切都OK。但是,當我運行生成可執行文件我得到這個:

C:\Users\test\Documents\MiniCryptoCodec\minicryptocodec>dist\crypto\crypto.exe 
Traceback (most recent call last): 
    File "crypto.py", line 1, in <module> 
    from Crypto.Cipher import AES 
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 655, in _load_unlocked 
    File "c:\users\test\appdata\local\programs\python\python36\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\Crypto\Cipher\__init__.py", line 3, in <module> 
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked 
    File "<frozen importlib._bootstrap>", line 655, in _load_unlocked 
    File "c:\users\test\appdata\local\programs\python\python36\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module 
    exec(bytecode, module.__dict__) 
    File "site-packages\Crypto\Cipher\_mode_ecb.py", line 46, in <module> 
    File "site-packages\Crypto\Util\_raw_api.py", line 189, in load_pycryptodome_raw_lib 
OSError: Cannot load native module 'Crypto.Cipher._raw_ecb' 
[2824] Failed to execute script crypto 

我什至增加'pycryptodome'hiddenimports列表中規範文件,但它仍然無法正常工作。

我需要做些什麼來建立一個使用pycryptodome的工作可執行文件?

回答

0

您可能需要PyInstaller的最新版本 - 有一個「鉤」的pycryptodome加入三個月前 https://github.com/pyinstaller/pyinstaller/tree/develop/PyInstaller/hooks

加入鉤我有其他問題後,並能得到它的工作通過安裝CFFI包 https://pypi.python.org/pypi/cffi

pip install cffi 
+1

不幸的是,它沒有工作,我安裝了版本1.11.2,當我運行內置的可執行文件時,出現:'加載Python DLL錯誤':C:\ Users \ test \ Documents \ MiniCryptoCodec \ minicryptocodec \ build \ crypto \ python36。 DLL」。 LoadLibrary:無法找到指定的模塊。# – Pablo

+1

我已經安裝了PyInstaller:3.4.dev0 + 133d18156,並且我得到了同樣的錯誤。 – Pablo

0

如果你想解決你的問題使用pycryptodomex

pip uninstall -y pycryptodome 
pip install pycryptodomex 

然後搜索並輸入所有的Crypto,並用Cryptodome替換它們。

相關問題