【发布时间】:2020-10-24 16:42:56
【问题描述】:
这是我的代码,用于测试我的三个不同函数,它们使用 2000 个随机密钥对 2000 个长度不超过 500 的随机字符串执行简单的替换加密。
输出显示最好的函数是encrypt3,然后是encrypt1,最慢的是encrypt2。
还有哪些其他方法可以比encrypt3 更快地执行替换?
对大写字母“A”到“Z”进行替换,不允许使用其他字符,并且不需要测试输入字符串是否仅包含这些字符。
代码的最后是测试所有函数是否产生相同的输出。
from random import randrange, seed, sample
from time import perf_counter
alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def encrypt1(t,key):
v=dict(zip(alphabet,key))
return ''.join(v.get(n) for n in t)
def encrypt2(t,key):
return ''.join(key[alphabet.index(n)] for n in t)
def encrypt3(t,key):
return t.translate(str.maketrans(alphabet,key))
d=2000 # number of strings and keys to test
length=500 # biggest length of strings
strings=[''.join(chr(randrange(26)+65) for n in range(1,randrange(1,length))) for n in range(d)]
keys=[''.join(chr(n+65) for n in sample(range(26), 26)) for n in range(d)]
a=perf_counter()
en1=[encrypt1(strings[n],keys[n]) for n in range(d)]
b=perf_counter()
print('encrypt1 time:',b-a)
a=perf_counter()
en2=[encrypt2(strings[n],keys[n]) for n in range(d)]
b=perf_counter()
print('encrypt2 time:',b-a)
a=perf_counter()
en3=[encrypt3(strings[n],keys[n]) for n in range(d)]
b=perf_counter()
print('encrypt3 time:',b-a)
print("All encryptions outputs are same:",en1==en2==en3)
输出:
# encrypt1 time: 0.09787979999999999
# encrypt2 time: 0.16948359999999996
# encrypt3 time: 0.029016399999999998
# All encryptions outputs are same: True
【问题讨论】:
-
我严重怀疑你会比
maketrans做得更好,这是 Python 的内置函数,可以完全满足你的需求。为什么,确切地说,你要优化这个? -
例如,当你想攻击替换密码时,你需要一个快速的加密/解密函数——至少我猜是这样的 :-)
-
您通常不会通过尝试全部 26 个来破解替换密码!可能性。频率分析更为重要。
-
我知道,但无论如何你需要测试很多键,即使远少于 26 个!。
-
@Frank Yellin:顺便问一下,我在哪里可以找到函数
maketrans和translate的源代码?
标签: python string optimization substitution