Each Answer to this Q is separated by one/two green lines.
I have written code to generate public and private keys. It works great at Python 3.7 but it fails in Python 3.8. I don’t know how it fails in the latest version. Help me with some solutions.
Here’s the 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)
Error in Python 3.8 version:
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'
time.clock() was removed in 3.8 because it had platform-dependent behavior:
On Unix, this returns the current processor time (in seconds)
On Windows, this returns wall-clock time (in seconds)
# I ran this test on my dual-boot system as demonstration: print(time.clock()); time.sleep(10); print(time.clock()) # Linux: 0.0382 ---------------------------> 0.0384 # Windows: 26.1224 ---------------------------> 36.1566
So which function to pick instead?
Processor Time: This is how long this specific process spends actively being executed on the CPU. Sleep, waiting for a web request, or time when only other processes are executed will not contribute to this.
Wall-Clock Time: This refers to how much time has passed “on a clock hanging on the wall”, i.e. outside real time.
time.time()also measures wall-clock time but can be reset, so you could go back in time
time.monotonic()cannot be reset (monotonic = only goes forward) but has lower precision than
time.clock is deprecated
- Just go to your C folder and search site-packages in the search bar. You will see the result like this:
Right click on this result marked as Red, and open file location.
Then look for sqlalchemy/util/compat.py file and open it. And search time.clock using ctrl+f and replace it with time.time
- Go to your error last line and go to that directory and open that particular file.
- search time.clock using ctrl+f and replace it with time.time
Necroposting this ugly monkey patch:
import time time.clock = time.time
Works as a last resort, but not recommended.
Go to the the code C:\Users\Mr\anaconda3\envs\pythonProject2\Lib\site-packages\sqlalchemy\util and select compat.py and search for
time.clock in code.
time.time and save it.
The module you use to generate key call a method that have been depreciated since python 3.3 time.clock().
You could downgrade to python 3.7 or change the source code to replace it. You should open an issue for that as well.
AttributeError: module 'time' has no attribute 'clock'
It is deprecated as said which means just use the latest versions of libraries that have that module. For example, depending on the dependency you have, Remove and Install
Crypto==1.4.1, or Mako==1.1.2 or SQLAlchemy==1.3.6 //etc
The idea is you don’t have to downgrade your python version as this will catch up with you later. Just update the packages to more late ones which are compatible with Python 3.8
time.clock is used in many old libraries.
time.clock is removed, one must click on the path given in the error.
This will navigate you to the line where
time.clock is written, and just change it to
Open the file and go to the line as pointed in the error message, change the
time.clock() line to
time.perf_counter(), if it still doesn’t work modify it to
I had the same issue for encrypting a string using AES in my project neehack.com and I fixed it by updating
venv/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py line 77 to
t = time.time() and it is now fixed.
Just open File “/home/paulsteven/.local/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py”, line 77
and change from
t = time.clock()
t = time.time
In my case I replace time.clock() with time.time()
If you have database involved, upgrade it.
pip install --upgrade flask_sqlalchemy
Open file that debug error line.
And change t = time.clock() to t = time.time
testing on python3.6 env :
>>> print("%s %s" % (time.process_time(), time.clock())) >>> 0.288050639 0.288056
that mean process_time is what the lib require.