因此,对于我编写的特定代码而言,这将更少,而且更多的是我的程序设计中出现的逻辑问题。该程序基本上是我的enigma机器版本。
首先,它有效。我刚刚添加了最后一个功能,即模拟机器的插板;它会添加在加密过程中切换的字符对,这就是问题所在。
让我们说我加密了TANIA这个词。它出现在GIAKE。
到目前为止一切顺利。但后来我添加了一个开关; A => I.加密工作正常但是当我解密时会发生的事情是它试图扭转这个过程。 TANIA中的A是正确的,但是我变成了A。
看到问题?
解密过程无法区分切换的I和不切换的I。它在引擎盖下工作的方式是在正常过程之前切换字母。
所以TANIA通过交换机变成了TINII。然后它正常加密它。当它解密时,它会出现TINII这个词,就像它应该的那样,但是然后开关转动了I,提出了TANAA这个词。
我希望能够清楚这一点。我一直在考虑如何改变这个过程,但最终,同样的转换问题仍然存在。有人知道如何解决这个问题吗?
我可以提供代码本身,但我认为可能没有必要。虽然请告诉你是否真的想看到它。只是不想淹没我的帖子。
修改 经过几次回复,决定添加流程描述和代码本身的链接。
字符串中的每个字符都是单独处理的,每个字符都会在程序移动到下一个字符之前贯穿整个过程。所以T首先加密,然后加A,然后加N,依此类推。
流程本身如下:
SWITCHES -> ROTOR 1 -> ROTOR 2 - ROTOR 3 -> OUTPUT
解密功能的方式相同,只是反向
ROTOR 3 -> ROTOR 2 -> ROTOR 1 -> SWITCHES -> OUTPUT
处理完每个字母后转动转子。第一个转向与每个字符,第二个在第一个完成一个完整周期后,第三个在第二个完成一个完整周期后。
转子本身就是物体,拿着乱七八糟的字母。
因此,作为一个例子,如果我们只是加密字母T,使用Switch T => U.在程序中,它看起来像这样。
T switched to U -> U becomes G -> G becomes K -> K becomes C -> output is C.
一次为每个角色运行此循环。
代码:
Enigma.cs http://pastebin.com/E3Ytxdg6(这是实际的工作马)
RotorSets.cs http://pastebin.com/7U6TiP9a
我为粘贴整个代码而道歉,但我想不出要粘贴哪些部分会证明问题。我之前的描述似乎仍然是描述问题本身的最佳方式。
最后代码不是很大,但只是看起来很大,因为VS希望将每个括号格式化为自己的行,因为我喜欢写很多评论。