Python 解密算法的问题
我在尝试反转加密算法时遇到了一些问题。该算法是Caesar密码的变体,其工作原理如下:Python 解密算法的问题,python,algorithm,encryption,Python,Algorithm,Encryption,我在尝试反转加密算法时遇到了一些问题。该算法是Caesar密码的变体,其工作原理如下: (V1 + V2 + D) % 26 + 1 其中,V1是映射到相关数字(A=1等)的待加密短语的字母,V2是用户选择的密钥的字母(与短语长度相同),再次映射到相关数字,D是选择的置换值,范围为1-10 我面临的问题是试图扭转这种局面。我尝试过简单地反转算法: (V1 - V2 - D) % 26 - 1 但这显然是失败的,因为涉及到模量。我还尝试: (V1 - V2 - D + 26) % 26 在他
(V1 + V2 + D) % 26 + 1
其中,V1
是映射到相关数字(A=1等)的待加密短语的字母,V2
是用户选择的密钥的字母(与短语长度相同),再次映射到相关数字,D
是选择的置换值,范围为1-10
我面临的问题是试图扭转这种局面。我尝试过简单地反转算法:
(V1 - V2 - D) % 26 - 1
但这显然是失败的,因为涉及到模量。我还尝试:
(V1 - V2 - D + 26) % 26
在他的建议下,这又失败了。如果有人能告诉我解决这个问题的方法,或者至少给我指出正确的方向,那将是非常有帮助的
(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
这相当于
(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
这相当于
(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
这相当于
(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
你需要将其视为一个等式,你不能简单地切换到-并希望得到最好的结果。你需要将其视为一个等式,你不能简单地切换到-并希望得到最好的结果。你需要将其视为一个等式,你不能简单地切换到-并希望得到最好的结果。你需要将其视为一个等式,你不能简单地将+切换到-并期待最好的结果。谢谢你的回答,但我无法让它工作。当我尝试用V1和V2作为1(A)时,加密是7,这是G。当我使用该算法解密时,我得到了21,这是U。你能再检查一遍吗?抱歉打扰您。我假设您的
d
当时是4
(唯一满足7
结果的d
:encode(1,1,4)=7
)。然后,解码(7,1,4)==1
。解码时,您的V1
应该是加密字符;运行decode(1,1,4)
做了错误的事情。谢谢你的回答,但我无法让它工作。当我尝试用V1和V2作为1(A)时,加密是7,这是G。当我使用该算法解密时,我得到了21,这是U。你能再检查一遍吗?抱歉打扰您。我假设您的d
当时是4
(唯一满足7
结果的d
:encode(1,1,4)=7
)。然后,解码(7,1,4)==1
。解码时,您的V1
应该是加密字符;运行decode(1,1,4)
做了错误的事情。谢谢你的回答,但我无法让它工作。当我尝试用V1和V2作为1(A)时,加密是7,这是G。当我使用该算法解密时,我得到了21,这是U。你能再检查一遍吗?抱歉打扰您。我假设您的d
当时是4
(唯一满足7
结果的d
:encode(1,1,4)=7
)。然后,解码(7,1,4)==1
。解码时,您的V1
应该是加密字符;运行decode(1,1,4)
做了错误的事情。谢谢你的回答,但我无法让它工作。当我尝试用V1和V2作为1(A)时,加密是7,这是G。当我使用该算法解密时,我得到了21,这是U。你能再检查一遍吗?抱歉打扰您。我假设您的d
当时是4
(唯一满足7
结果的d
:encode(1,1,4)=7
)。然后,解码(7,1,4)==1
。解码时,您的V1
应该是加密字符;运行decode(1,1,4)
会做错误的事情。