我已经编写了生成公共和私有密钥的代码。它在Python 3.7上运行良好,但在Python 3.8中失败。我不知道在最新版本中它怎么会失败。为我提供一些解决方案。
这是代码:
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)
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'
答案 0 :(得分:20)
@android:drawable/
在3.8中被删除 ,因为它具有platform-dependent behavior:
在 Unix 上,它返回当前的处理器时间(以秒为单位)
在 Windows 上,它返回时钟时间(以秒为单位)
@drawable/
那要选择哪个函数呢?
处理器时间:这是该特定进程在CPU上有效执行所花费的时间。睡眠,等待Web请求或仅执行其他进程的时间都不会造成这种情况。
time.clock()
墙壁时钟时间:这是指“挂在墙上的时钟上”经过的时间,即实时时间。
使用# I ran this test on my dual-boot system as demonstration:
print(time.clock()); time.sleep(10); print(time.clock())
# Linux: # Windows:
# 0.0382 # 26.1224
# 0.0384 # 36.1566
time.process_time()
还可测量挂钟时间,但可以重置,因此您可以返回上一时间time.perf_counter()
无法重设(单调=只能向前移动),但精度低于time.time()
答案 1 :(得分:18)
检查您是否正在使用PyCrypto,如果是,则将其卸载并安装PyCryptodome,它是PyCrypto的分支
PyCrypto已死,如project issue page
所述由于这两个库可以共存,所以也可能是一个问题
pip3 uninstall PyCrypto
pip3 install -U PyCryptodome
答案 2 :(得分:8)
从Python 3.3开始不推荐使用的功能
time.clock()
已被删除:根据您的要求,改用time.perf_counter()
或time.process_time()
具有明确的行为。 (由Matthias Bussonnier在bpo-36895中贡献。)
答案 3 :(得分:3)
AttributeError: module 'time' has no attribute 'clock'
它已被弃用,这意味着仅使用具有该模块的最新版本的库。例如,根据您所拥有的依赖性,删除并安装
Crypto == 1.4.1,或Mako == 1.1.2或SQLAlchemy == 1.3.6 // etc
这个想法是您不必降级python版本,因为以后会跟上您的脚步。只需将软件包更新为与Python 3.8兼容的最新软件包
答案 4 :(得分:3)
右键点击这个标记为红色的结果,然后打开文件位置
然后查找 sqlalchemy/util/compat.py 文件并打开它。并使用 ctrl+f 搜索 time.clock 并将其替换为 time.time
答案 5 :(得分:1)
time.clock
用于许多旧库中。
现在 time.clock
已删除,必须单击错误中给出的路径。
这会将您导航到写入 time.clock
的行,并将其更改为 time.time
。
答案 6 :(得分:0)
用于生成键调用的模块,此方法自python 3.3 time.clock()起已弃用。
您可以降级到python 3.7或更改源代码以替换它。您也应该为此打开一个问题。
答案 7 :(得分:0)
转到代码C:\ Users \ Mr \ anaconda3 \ envs \ pythonProject2 \ Lib \ site-packages \ sqlalchemy \ util,然后选择compat.py并在代码中搜索total = 0
count = 0
average = 0
lst = []
while True:
inp = input("Enter number: ")
try:
if inp == "done":
break
value = float(inp)
total = total + value
count = count + 1
average = total / count
except ValueError:
print("Invalid Input")
print(total, count, average)
。
然后将time.clock
替换为time.clock
并保存。
答案 8 :(得分:0)
在我的项目neehack.com中,使用AES加密字符串存在相同的问题,我通过将venv/lib/python3.8/site-packages/Crypto/Random/_UserFriendlyRNG.py
第77行更新为t = time.time()
进行了修复,现在已修复。
答案 9 :(得分:0)
如果涉及到数据库,请升级它。
pip install --upgrade flask_sqlalchemy
答案 10 :(得分:0)
打开文件并转到错误信息中指出的行,将time.clock()
行更改为time.perf_counter()
,如果仍然不起作用将其修改为time.time
>