我在试图逆转我的加密算法时遇到了一点困难。该算法是凯撒密码的一个变种,其工作方式如下:
(V1 + V2 + D) % 26 + 1如果V1是要加密到相关数字的短语的字母(A = 1,等等),则V2是用户选择密钥的字母(与短语长度相同),再次映射到相关的数字,D是选定的位移值,范围为1-10。
我面临的问题是试图扭转这一局面。我尝试过简单地逆转算法:
(V1 - V2 - D) % 26 - 1但这显然失败了,因为所涉及的模数。我还试图:
(V1 - V2 - D + 26) % 26根据这里的建议,但还是失败了。如果有人能告诉我解决这个问题的方法,或者至少给我指明正确的方向,那将是非常有帮助的。
发布于 2014-07-02 07:56:01
(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)
# => Truehttps://stackoverflow.com/questions/24525619
复制相似问题