我试着用java写一个维吉内尔密码程序,我遇到了一些关于代码的加密/解密部分的问题。我知道我应该如何处理加密/解密,但我在将其转换为代码时遇到了困难。
让我首先解释一下这个项目:
对于这个项目,我正在创建一个密码程序(Vigenere cipher不同于caesar cipher,因为Vigenere允许密钥是一个单词,而不仅仅是一个字母或数字),它首先提示用户他/她想要加密或解密消息。一旦用户做出选择,程序就会提示用户输入"key“。关键字必须是小写的,并且是一个单词,而不是符号或数字。然后,程序将要求用户提供一个输入文件,其中包含用户想要解密或加密的消息。然后,程序提示用户输入输出文件名,并将解密/加密的消息存储在该文件中。
假设消息是"Meet at 567“,密钥是ct,用户想要加密消息,输出结果应该类似于"Oexl ct 567”。
我的代码的encryptLine/decryptLine方法只需要加密/解密一行文本。代码的其他部分将处理其他行。对于我到目前为止已经完成的代码,decryptLine是完全错误的,现在,我只想专注于encryptLine。一旦我弄清楚了这一点,弄清楚decryptLine应该不是那么难。在下面的文章中,我在我的encryptLine方法中对我正在尝试做的事情发表了评论。加密是有效的,只是当它遇到一个空格或符号时,它会遇到麻烦。我知道它有很多冗余的代码,但这是我能想到的最好的东西,因为我是新手。
提前感谢您的帮助!
发布于 2012-03-25 00:51:43
问题是,当您在line中处理位置i时,您希望能够基于i计算key中的位置。这是有道理的- key.charAt(i%(key.length()+1))几乎是正确的(尽管实际上它必须是key.charAt(i%key.length()),没有+1,因为key中的有效位置从0到key.length()-1) -但它不会对您起作用,因为您不想让某些字符“计数”,也就是说,您不希望它们“用完”key中的一个字符。因此,您在key中的位置实际上在某种程度上独立于i,因为它还取决于您已经在line中看到的字符类型。
因此,您真正需要的是在key中有一个完全独立的索引j。每次处理来自line的信件时,都会递增j。然后,您可以使用模数方法并编写key.charAt(j%key.length()),或者在每次j为0时将其重置为key.length()。
https://stackoverflow.com/questions/9853285
复制相似问题