Vigenere 给出错误的结果

Posted

技术标签:

【中文标题】Vigenere 给出错误的结果【英文标题】:Vigenere giving wrong result 【发布时间】:2019-11-05 05:32:13 【问题描述】:

任务是在运行程序时给出一个关键字参数,我将其保存为string k,然后用户输入文本,程序将根据关键字输出输入的文本。 A = 0, B = 1,所以如果关键字是ABABA,文本是hello,就会输出hflmo。

如果我运行程序,将argv[1] 作为“abc”,然后将纯文本pt 作为“hello”,我应该得到“hfnlp”,但我得到“hnflv”,为什么最后一个字母不加密正确吗?

    string k = argv[1];
    int l = strlen(argv[1]);
    printf("plaintext: ");
    string pt = get_string("");
    printf("ciphertext: ");
    for (int i = 0, shift = 0; i < strlen(pt); i++)
        
        if (!isalpha(pt[i]))
        
            printf("%c", pt[i]);
        
        else
        
            if (isupper(pt[i]))
            
                if (isupper(k[shift]))
                
                    printf("%c", (((pt[i] - 65) + (k[shift % l] - 65)) %26) + 65);
                    shift++;
                
                else
                
                    printf("%c", (((pt[i] - 65) + (k[shift % l] - 97)) %26) + 65);
                    shift++;
                
            
            else if (islower(pt[i]))
            
                if (isupper(k[shift]))
                
                    printf("%c", (((pt[i] - 97) + (k[shift % l] - 65)) %26) + 97);
                    shift++;
                
                else
                
                    printf("%c", (((pt[i] - 97) + (k[shift % l] - 97)) %26) + 97);
                    shift++;
                
            
            
                                   
    printf("\n");
    return 0;
    

【问题讨论】:

"How to debug small programs" 你能简单解释一下任务是什么吗? 我已经添加了解释,对不起,我以为因为这个问题已经发布了很多不同的问题,所以大多数人都会知道它是什么。 请将显示的代码升级为minimal reproducible example。考虑在硬编码的初始化数组中提供要处理的数据。否则,请确保输入也以明确的方式提供。 不要使用幻数。使用'A' 而不是'65' 等。 【参考方案1】:

线条

if (isupper(k[shift]))

缺少模数计算。正确的版本是:

if (isupper(k[shift % l]))

如果你把这个计算放在for-loop 的某个中心位置可能会更清楚:

shift %= l;

【讨论】:

以上是关于Vigenere 给出错误的结果的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere-cipher 错误输出

Vigenere Cipher - 解密(手动)

C++ 中的 Vigenere 密码错误

CS50 Vigenere - 输出不正确

cs50 的 Vigenere 密码程序错误

Python Vigenere 元组错误