AttributeError: le module 'time' n'a pas d'attribut 'clock' dans Python 3.8

23

J'ai écrit du code pour générer des clés publiques et privées. Cela fonctionne très bien dans Python 3.7 mais il échoue dans Python 3.8. Je ne sais pas comment cela échoue dans la dernière version. Aidez-moi avec quelques solutions.

Voici le code:

from Crypto.PublicKey import RSA


def generate_keys():
    modulus_length = 1024
    key = RSA.generate(modulus_length)
    pub_key = key.publickey()
    private_key = key.exportKey()
    public_key = pub_key.exportKey()
    return private_key, public_key


a = generate_keys()
print(a)

Erreur dans la version Python 3.8:

Traceback (most recent call last):
  File "temp.py", line 18, in <module>
    a = generate_keys()
  File "temp.py", line 8, in generate_keys
    key = RSA.generate(modulus_length)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/PublicKey/RSA.py", line 508, in generate
    obj = _RSA.generate_py(bits, rf, progress_func, e)    # TODO: Don't use legacy _RSA module
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/PublicKey/_RSA.py", line 50, in generate_py
    p = pubkey.getStrongPrime(bits>>1, obj.e, 1e-12, randfunc)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Util/number.py", line 282, in getStrongPrime
    X = getRandomRange (lower_bound, upper_bound, randfunc)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Util/number.py", line 123, in getRandomRange
    value = getRandomInteger(bits, randfunc)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Util/number.py", line 104, in getRandomInteger
    S = randfunc(N>>3)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 202, in read
    return self._singleton.read(bytes)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 178, in read
    return _UserFriendlyRNG.read(self, bytes)
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 129, in read
    self._ec.collect()
  File "/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py", line 77, in collect
    t = time.clock()
AttributeError: module 'time' has no attribute 'clock'
Smack Alpha
la source
référencé ici dans la lib Crytpo: github.com/dlitz/pycrypto/issues/283 Mais le ticket ne semble pas fermé depuis un bon an.
Fabien Antoine

Réponses:

22

Depuis le document Python 3.8 :

La fonction time.clock()a été supprimée, après avoir été dépréciée depuis Python 3.3: utilisez time.perf_counter()ou à la time.process_time()place, selon vos besoins, pour avoir un comportement bien défini. (Contribution de Matthias Bussonnier dans bpo-36895 .)

Angus Tay
la source
1

Le module que vous utilisez pour générer des clés appelle une méthode qui s'est dépréciée depuis python 3.3 time.clock () .

Vous pouvez rétrograder vers python 3.7 ou modifier le code source pour le remplacer. Vous devriez également ouvrir un problème pour cela.

Florian Bernard
la source
0
AttributeError: module 'time' has no attribute 'clock' 

Il est déconseillé comme indiqué, ce qui signifie qu'il suffit d'utiliser les dernières versions des bibliothèques qui ont ce module. Par exemple, selon la dépendance dont vous disposez, Supprimer et installer

Crypto == 1.4.1, ou Mako == 1.1.2 ou SQLAlchemy == 1.3.6 // etc

L'idée est que vous n'avez pas à rétrograder votre version de python car cela vous rattrapera plus tard. Mettez simplement à jour les packages vers des versions plus tardives compatibles avec Python 3.8

joash
la source