用 C 编写 Vigenere 密码(保留空格)

Posted

技术标签:

【中文标题】用 C 编写 Vigenere 密码(保留空格)【英文标题】:Writing Vigenere Cipher in C (Keep Spaces) 【发布时间】:2020-01-28 23:47:15 【问题描述】:

我正在尝试编写一个保留空格的 Vigenere Cipher (in c)。因此,如果给我一个简单的消息“你好,你好吗”,密码将采用这种形式“abcde fgh ijk lmn”,我想要的只是保留空格。我已经为此工作了一段时间。任何帮助,将不胜感激。

这是我的代码

void CipherText(char* plainText, char* cipherKey)

    int keyLength = strlen(cipherKey);
    char cipherText;

    for(int i = 0; i < strlen(plainText); i++)
    

        int cipherText = (unsigned char)plainText[i];

        cipherText = ((int)plainText[i]-97+(int)tolower(cipherKey[i])-97)%26 + 'A';

        putchar(cipherText);
    
    putchar('\n');

【问题讨论】:

这段代码有什么问题?当前输出与您尝试的输出有何不同? if (isalpha(cipherText)) cipherText = … — 仅在字符是字母时才转换字符(但无论如何都打印)。 【参考方案1】:

在尝试转换(编码)字符之前测试字符是否是字母。另外,不要使用数字作为字符代码——例如,使用'a' 而不是97。我删除了一些不必要的演员表。我还使用了cipherText 而不是(int)plainText[i],因为这样可以避免不需要的符号扩展。我还添加了一些空格;明智地使用空格会更容易阅读代码。

void CipherText(char* plainText, char* cipherKey)

    int keyLength = strlen(cipherKey);
    char cipherText;

    for(int i = 0; i < strlen(plainText); i++)
    
        int cipherText = (unsigned char)plainText[i];
        if (isalpha(cipherText))
            cipherText = (cipherText - 'a' + tolower(cipherKey[i]) - 'a') % 26 + 'A';
        putchar(cipherText);
    
    putchar('\n');

【讨论】:

以上是关于用 C 编写 Vigenere 密码(保留空格)的主要内容,如果未能解决你的问题,请参考以下文章

vigenere密码c语言

Python 中的 Vigenere 密码

尝试加密和解密 vigenere 密码

Vigenere Cipher 用于带有空格的句子

Java 中的 Vigenere 密码算法 - 将消息解密为明文

Vigenere Cipher 只能在处理 C 中的空格(“”)之前有效 - 为啥?