【问题标题】:Vigenere Cipher output维吉尼亚密码输出
【发布时间】:2016-01-18 00:08:13
【问题描述】:

我正在查看http://rosettacode.org/wiki/Vigen%C3%A8re_cipher#Java 上提供的 Vigene Ciphere 源代码。我尝试自己测试该程序,但它没有输出我基于 vigene 所期望的值。例如,“dog”是单词,“bob”是密钥,我希望它被加密为“ech”,但改为“qot”。

public static void main(String[] args) {
    String key = "bob";
    String ori = "dog";
    String enc = encrypt(ori, key);
    System.out.println(enc);

}

static String encrypt(String text, final String key) {
    String res = "";
    text = text.toLowerCase();
    for (int i = 0, j = 0; i < text.length(); i++) {
        char c = text.charAt(i);
        if (c < 'a' || c > 'z') continue;
        res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A');
        j = ++j % key.length();
    }
    return res;
}

但是输出不同。这是因为我对密码的理解不正确,还是对众所周知的 vigenere 密码采取了不同的方法。

【问题讨论】:

  • "但是输出不同" 是什么?
  • @RishavKundu 假设这不仅仅是我没听过的首字母缩写词,最好将其包含在问题中 - 已添加。
  • @AndyTurner 注意输出是大写的;我不知道这是否重要。

标签: java vigenere


【解决方案1】:

由于您将文本设置为小写加密,因此请尝试将这些字符文字也更改为小写:

res += (char)((c + key.charAt(j) - 2 * 'a') % 26 + 'a');

将 int 转换为 char 时,必须考虑到 'a' 的整数值不等于 'A'。因为您正在检查您当前的字符是否在 'a' 和 'z' 之间(因为您已将其设置为小写),所以您也应该有一个小写的输出。

【讨论】:

  • 啊,谢谢!你能向我解释一下这条线实际上在做什么吗?
  • 因为java中的字符值有不同的整数值(2 * 'a' 和 2 * 'A' 不一样),结果字符会根据计算出的整数值略有偏差,然后转换为一个字符。
【解决方案2】:

正如用户已经指出的那样,您应该将行更改为:

res += (char)((c + key.charAt(j) - 2 * 'a') % 26 + 'a');

或者,您可以更改此设置:

if (c < 'a' || c > 'z') continue;

到这里:

if (c < 'A' || c > 'Z') continue;

只需确保在将 ASCII 转换回字母时使用正确的 ASCII 值(即 65 (A) 为大写,97 (a) 为小写)。

【讨论】:

  • "或者,您可以更改..." 这意味着不会加密任何内容,因为前面几行是 text.toLowerCase()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2015-12-01
相关资源
最近更新 更多