2017-08-26 6 views
0

Je suis en train d'exécuter un programme de base crypto écrit en Python, et même si cela fonctionne correctement sur OS X, je ne peux pas le faire fonctionner sous Windows (3.6/Anaconda installé avec VS 2017) quand j'ai vérifié dans la configuration que je voulais installer Python, et dans une installation binaire 3.4 autonome).Erreur avec cryptographie Python sous Windows

Comme individuellement chaque déclaration d'importation fonctionne dans l'interpréteur, mais dans son ensemble ce programme ne fonctionne pas

from hashlib import sha256 

from pbkdf2_ctypes import * 
import hmac 
import hashlib 
import binascii 
from os import urandom 
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes 
from cryptography.hazmat.backends import default_backend 
import getpass 

masterpassword = "thisisamasterpassword" 
salt = urandom(16) 
masterpassword = pbkdf2_hex(masterpassword.encode('utf-8'), salt) 
password = masterpassword.decode() 
salt = binascii.hexlify(salt) 
salt = salt.decode() 

print(masterpassword) 

Le résultat est:

C:\Users\me\Desktop>py -3.4 masterpassword.py 
Traceback (most recent call last): 
    File "C:\Python34\lib\site-packages\pbkdf2_ctypes.py", line 127, in <module> 
    raise OSError('Library not found') 
OSError: Library not found 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "masterpassword.py", line 3, in <module> 
    from pbkdf2_ctypes import * 
    File "C:\Python34\lib\site-packages\pbkdf2_ctypes.py", line 153, in <module> 
    raise ImportError('Cannot find a compatible cryptographic library ' 
ImportError: Cannot find a compatible cryptographic library on your system 

J'ai également installé à la fois un binaire OpenSSL (https://slproweb.com/products/Win32OpenSSL.html) et s'est assuré qu'il fonctionnait sous Anaconda.

Répondre

1

Si je devais deviner ce code n'a jamais fonctionné sur une machine Windows-64 bits. L'erreur qui est soulevée provient de pbkdf2_ctypes dans la logique de recherche de la bibliothèque de chiffrement; et je pense que ce fut un accident (bien sensible) hypothèse que libeay64.dll sera installé sur les systèmes 64 bits et libeay32.dll pour les systèmes 32 bits:

if system == 'Windows': 
    if platform.architecture()[0] == '64bit': 
     libname = ctypes.util.find_library('libeay64') # <--- This does not exist even on 64bit machines ... :) 
     if not libname: 
      raise OSError('Library not found') 
     crypto = ctypes.CDLL(libname) 
    else: 
     libname = ctypes.util.find_library('libeay32') 
     if not libname: 
      raise OSError('Library libeay32 not found.') 

Vous pouvez essayer de contacter quelqu'un de Glisco, mais je ne pense pas qu'ils sont plus autour que leur base de code publique est allé tout à fait pour quelques années maintenant.

Pour vous aider à aller

Vous pouvez:

  1. run ctypes.util.find_library('libeay32') en python et voir où votre bibliothèque est. Puis copiez libeay32.dll vers libeay64.dll dans le même dossier. Cela ne devrait pas causer de problèmes parce que vous dupliquez un fichier qu'aucun autre programme n'est au courant.

  2. Supprimez from pbkdf2_ctypes import * et ajoutez ces fonctions à votre code qui ont été extraites de pbkdf2_ctypes.

    ctypes importation importation ctypes.util

    libname = ctypes.util.find_library ('libeay32') = Crypto ctypes.CDLL (libname)

    def _openssl_hashlib_to_crypto_map_get (hashfunc): hashlib_to_crypto_map = { hashlib.md5: crypto.EVP_md5, hashlib.sha1: crypto.EVP_sha1, hashlib.sha256: crypto.EVP_sha256, hashlib.sha224: crypto.EVP_sha224, hashlib.sha384: crypto.EVP_sha384, hashlib.sha512: crypto.EVP_sha512} crypto_hashfunc = hashlib_to_crypto_map.get (hashfunc) si crypto_hashfunc est None: augmenter ValueError ('Unkwnown digest%' % de hashfunc) crypto_hashfunc.restype = ctypes.c_void_p crypto_hashfunc de retour()

    def _openssl_pbkdf2 (données, le sel, les itérations, Digest, keylen): "" "OpenSSL enveloppe compatibile """ c_hashfunc = ctypes.c_void_p (_openssl_hashlib_to_crypto_map_get (digérer))

    c_pass = ctypes.c_char_p(data) 
    c_passlen = ctypes.c_int(len(data)) 
    c_salt = ctypes.c_char_p(salt) 
    c_saltlen = ctypes.c_int(len(salt)) 
    c_iter = ctypes.c_int(iterations) 
    c_keylen = ctypes.c_int(keylen) 
    c_buff = ctypes.create_string_buffer(keylen) 
    
    crypto.PKCS5_PBKDF2_HMAC.argtypes = [ctypes.c_char_p, ctypes.c_int, 
               ctypes.c_char_p, ctypes.c_int, 
               ctypes.c_int, ctypes.c_void_p, 
               ctypes.c_int, ctypes.c_char_p] 
    
    crypto.PKCS5_PBKDF2_HMAC.restype = ctypes.c_int 
    err = crypto.PKCS5_PBKDF2_HMAC(c_pass, c_passlen, 
            c_salt, c_saltlen, 
            c_iter, 
            c_hashfunc, 
            c_keylen, 
            c_buff) 
    return (err, c_buff) 
    

    def pkcs5_pbkdf2_hmac (données, le sel, les itérations = 1000, keylen = 24, hashfunc = None): si hashfunc est None: hashfunc = hashlib.sha1 err, c_buff = _openssl_pbkdf2 (données, le sel, les itérations, hashfunc, keylen)

    if err == 0: 
        raise ValueError('wrong parameters') 
    return c_buff.raw[:keylen] 
    

    def pbkdf2_hex (données, le sel, les itérations = 1000, keylen = 24, hashfunc = SO): binascii.hexlify de retour (pkcs5_pbkdf2_hmac (données, sel, itérations, keylen, hashfunc))

+0

Merci beaucoup! J'ai suivi votre première (plus facile, je suppose) solution de copier libeay32 à un nouveau libeay64, qui s'est avéré être dans C: \ ProgramFiles \ Anaconda \ Bibliothèque \ bin pour moi (exécutant le 3.6 qui est venu avec VS 2017). J'ai également remarqué ce test plus tôt où il échouait, mais je ne me sens pas aussi confiant en creusant dans ce code :( –