首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解密算法问题

解密算法问题
EN

Stack Overflow用户
提问于 2014-07-02 07:45:44
回答 1查看 68关注 0票数 0

我在试图逆转我的加密算法时遇到了一点困难。该算法是凯撒密码的一个变种,其工作方式如下:

代码语言:javascript
复制
(V1 + V2 + D) % 26 + 1

如果V1是要加密到相关数字的短语的字母(A = 1,等等),则V2是用户选择密钥的字母(与短语长度相同),再次映射到相关的数字,D是选定的位移值,范围为1-10。

我面临的问题是试图扭转这一局面。我尝试过简单地逆转算法:

代码语言:javascript
复制
(V1 - V2 - D) % 26 - 1

但这显然失败了,因为所涉及的模数。我还试图:

代码语言:javascript
复制
(V1 - V2 - D + 26) % 26

根据这里的建议,但还是失败了。如果有人能告诉我解决这个问题的方法,或者至少给我指明正确的方向,那将是非常有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-02 07:56:01

代码语言:javascript
复制
(v1 - v2 - d + 50) % 26 + 1

这相当于

代码语言:javascript
复制
(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

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24525619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档