Vigenere Cipher 黑鹰坠落

Posted

技术标签:

【中文标题】Vigenere Cipher 黑鹰坠落【英文标题】:Vigenere Cipher Black Hawk Down 【发布时间】:2015-03-28 16:12:07 【问题描述】:

我不明白为什么这东西不能正确加扰。我阅读了有关此密码的其他一些帖子,据我所知,我使用的算法与它们完全相同...

注释掉的区域是我试图确保一切都正确通过的测试。我相信这一切都是正确的,然后在算法中失败了。

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

string get_message(void);
string scramble(string key, string message);

int main(int argc, string argv[])

    if(argc == 2)
    
        string key;
        string message;

        key = argv[1]; 
        //printf("KEY: %s<<",key); 
        message = get_message();
        scramble(key, message);
    
    else
    
        printf("Please enter 2 arguments.\n");
        return 1;
    


string get_message(void)
   
    string message = "";
    do
    
        message = GetString();
    
    while(strlen(message) < 1);
    return message;


string scramble(string key,string message)
       
    for(int i = 0, len = strlen(message), key_len = strlen(key); i < len; i++)
       
        int letter = message[i];
        //int Tkey = atoi(key[i % key_len]); 
        //printf("KEY: %d<<\n",Tkey);

        if(islower(letter))
        
            //printf("KEY(%d)",(key[i % key_len]-97));
            letter = (((letter - 97) + (key[i % key_len])) % 26 + 97);
            //printf("(%d)",(letter - 97) + (key[i % key_len])%26);
            printf("%c",letter);
               
        else if(isupper(letter))
        
            //printf("(%d)", key[i]);
            //printf("(%c)",letter); WE HAVE CORRECT LETTER
            letter = (((letter - 65) + (key[i % key_len])) % 26 + 65);
            printf("%c",letter);
        
    
    printf("\n");
    return 0;

【问题讨论】:

您的问题到底是什么?您的输入是什么,您期望输出什么? 输出:上午 11 点在公园见我应该是: Negh zf av huf pcfx bt gzrwep oz 你必须查一下 vigenere cipher 是什么才能理解它转换字母。 GetString() 要求使用输入返回用户输入的字符串。是的,我可以在字符串上使用 strlen。 程序运行它只是没有正确打乱 【参考方案1】:

我认为你的计算是错误的:

你目前有

encryptedLetter = (letter - firstLetterOffset) + key[position % keyLength] % 26 + firstLetterOffset

通过检查C operator precedence table,我们注意到%-+ 之前被评估,这意味着您的代码实际上意味着:

encryptedLetter = (letter - firstLetterOffset) + ( key[position % keyLength] % 26 ) + firstLetterOffset

你想要的地方:

encryptedLetter = ( (letter - firstLetterOffset) + key[position % keyLength] ) % 26 + firstLetterOffset

结论:您需要添加更多括号来指定评估表达式的顺序。


此外,您将字母数字作为文本字符,但没有作为键!

正确表达

encryptedLetter = ( (letter - firstLetterOffset) + key[position % keyLength] - firstLetterOffset ) % 26 + firstLetterOffset

Demonstration in javascript

【讨论】:

谢谢。我更改了括号,但我仍然得到与之前相同的输出 Key:bacon Message:Meet Encrypted:Gxza 谢谢。 我忘记了,但似乎你和我都没有考虑到空间 刚刚注意到另一个错误,您将字母编号作为文本而不是密钥!更新了 javascript here 您的 javascript 代码是正确的。你可以测试它en.wikipedia.org/wiki/Vigen%C3%A8re_cipher查找keyplaintextciphertext进行测试。

以上是关于Vigenere Cipher 黑鹰坠落的主要内容,如果未能解决你的问题,请参考以下文章

Vigenere-cipher 错误输出

如何让我的 Vigenère Cipher 忽略原始消息中的空格

Vigenere Cipher - 解密(手动)

Vigenere Cipher - 解密(手动)

PSET 2:Vigenere Cipher 部分工作?

Vigenere Cipher - 不给信[关闭]