我在尝试反转加密算法时遇到了一些麻烦。该算法是凯撒密码的变体,其工作原理如下:
(V1 + V2 + D) % 26 + 1
其中V1
是要加密的短语的字母映射到相关的数字(A = 1等),V2
是用户选择密钥的字母(长度与短语),再次映射到相关的数字,D
是一个选定的位移值,范围从1到10.
我遇到的问题是试图扭转这种局面。我试过简单地反转算法:
(V1 - V2 - D) % 26 - 1
但由于涉及模数,这显然是失败的。我也尝试过:
(V1 - V2 - D + 26) % 26
根据here的建议,但这又失败了。如果有人能够向我展示解决方案,或者至少指出我正确的方向,那将是非常有帮助的。
答案 0 :(得分:3)
(v1 - v2 - d + 50) % 26 + 1
相当于
(v1 - v2 - d - 1 - 1 + 26 + 26) % 26 + 1
其中一个- 1
是为了补偿加密中的+ 1
。另一个- 1
和模数外的匹配+ 1
是将0
包裹回26
,而其余部分保持不变。让26
两次的原因仅仅是因为26
v1 - v2 - d - 1 - 1
不够,因为1 - 26 - 10 - 1 - 1
可以归结为-37
或import itertools
def encode(v1, v2, d):
return (v1 + v2 + d) % 26 + 1
def decode(v1, v2, d):
return (v1 - v2 - d + 50) % 26 + 1
all_combinations = map(tuple, itertools.product(
range(1, 27), range(1, 27), range(1, 11)))
all(decode(encode(v1, v2, d), v2, d) == v1 for v1, v2, d in all_combinations)
# => True
。
{{1}}