J'ai écrit du code pour générer des clés publiques et privées. Cela fonctionne très bien à Python 3.7 mais il échoue dans Python 3.8. Je ne sais pas comment il é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'
Depuis le doc Python 3.8 :
La fonction
time.clock()
a été supprimée, après avoir été dépréciée depuis Python 3.3: utilisez plutôttime.perf_counter()
outime.process_time()
à la place, selon vos exigences, pour avoir un comportement bien défini. (Contribution de Matthias Bussonnier in bpo-36895 .)
Le module que vous utilisez pour générer la clé 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 changer le code source pour le remplacer. Vous devriez également ouvrir un problème pour cela.
AttributeError: module 'time' has no attribute 'clock'
Il est obsolète comme dit, 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 besoin de rétrograder votre version python car cela vous rattrapera plus tard. Mettez simplement à jour les packages vers des versions plus tardives compatibles avec Python 3,8