首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vigenere密码输出

Vigenere密码输出
EN

Stack Overflow用户
提问于 2015-10-19 23:08:14
回答 2查看 459关注 0票数 3

我正在看http://rosettacode.org/wiki/Vigen%C3%A8re_cipher#Java上提供的Vigene Ciphere源代码。我亲自试着测试了这个程序,但它没有根据vigene输出我期望的值。例如,'dog‘是单词,'bob’是密钥,我希望将其加密为'ech',但实际上是'qot‘。

代码语言:javascript
复制
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密码采取了不同的方法。

EN

回答 2

Stack Overflow用户

发布于 2015-10-19 23:13:22

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

代码语言:javascript
复制
res += (char)((c + key.charAt(j) - 2 * 'a') % 26 + 'a');

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

票数 0
EN

Stack Overflow用户

发布于 2015-10-19 23:23:56

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

代码语言:javascript
复制
res += (char)((c + key.charAt(j) - 2 * 'a') % 26 + 'a');

或者,您可以对此进行更改:

代码语言:javascript
复制
if (c < 'a' || c > 'z') continue;

要这样做:

代码语言:javascript
复制
if (c < 'A' || c > 'Z') continue;

只需确保当您将ASCII码转换回字母时,您使用的是正确的ASCII值(例如,大写为65 (A),小写为97 (a) )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33217899

复制
相关文章

相似问题

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