使用 C++ 的 Vigenere Cipher 存在输出问题

Posted

技术标签:

【中文标题】使用 C++ 的 Vigenere Cipher 存在输出问题【英文标题】:Vinegere Cipher with C++ having an issue with output 【发布时间】:2014-02-04 06:25:10 【问题描述】:

我在尝试让我的代码正常工作时遇到了一些问题。它打印了几乎正确的数据,但可能没有正确循环?我认为它不会通过字母表重复键。都是小写,不超过26。

void vigenereEncrypt( const char  plaintext[], char ciphertext[], const char key[] )


int idx;
int j;

for( idx = 0, j = 0; idx <= strlen(plaintext); idx++ )

    if ( CHAR_OUT_OF_RANGE(plaintext[idx]) )
    
        ciphertext[idx] = plaintext[idx];
    
    else
    
        ciphertext[idx] = plaintext[idx];
        ciphertext[idx] += key[j] - MIN_ASCII_VALUE;

        if (ciphertext[idx] >= MAX_ASCII_VALUE) ciphertext[idx] += -MAX_ASCII_VALUE + MIN_ASCII_VALUE - 1;
    
    j = (j + 1) % strlen(key);


ciphertext[idx] = 0;    

例如:如果我使用 jerry 键输入纯文本碳粉,则输出将为 csevé。它应该将其更改为 csevp

【问题讨论】:

【参考方案1】:

帮大家(尤其是您自己)一个忙,使用std::string 代替C 风格的字符串。然后使用标准算法而不是 writing 自己搞乱循环。

#include <iostream>
#include <iterator>
#include <algorithm>

class crypt 
    std::string key;
    size_t pos;
public:
    crypt(std::string const &k) : key(k), pos(0)  

    char operator()(char input)  
        char ret = input ^ key[pos]; 
        pos = (pos + 1) % key.size(); 
        return ret; 
    
;

int main() 
    std::string input("This is some input to be encrypted by the crappy encryption algorithm.");

    std::transform(input.begin(), input.end(),
        std::ostream_iterator<char>(std::cout),
        crypt("This is the key"));
    return 0;

【讨论】:

【参考方案2】:

你的循环是一对一的。您应该使用 MAX_ASCII_VALUE,而不是 >=(但您还没有显示 MAX_ASCII_VALUE 是什么)。

但您的基本问题是有符号与无符号字符问题。对于带符号的字符,当它超过 127 时,它会回绕并变为负数,因此 > 测试在应该通过时会失败。

void vigenereEncrypt(const char plaintext[], char ciphertext[], const char key[])

    size_t i, j;
    for(i = 0, j = 0; i < strlen(plaintext); ++i )
    
        ciphertext[i] = plaintext[i];
        if (!CHAR_OUT_OF_RANGE(plaintext[i]))
        
            ciphertext[i] += (uchar)key[j] - (uchar)MIN_ASCII_VALUE;

            if ((uchar)ciphertext[i] > (uchar)MAX_ASCII_VALUE)
                ciphertext[i] -= (uchar)MAX_ASCII_VALUE - (uchar)MIN_ASCII_VALUE + 1;
        
        j = (j + 1) % strlen(key);
    

    ciphertext[i] = 0;

【讨论】:

它似乎仍然无法正常工作ooga。当我使用您的代码时,它没有编译,但是我更改了您指出的内容。它仍然给我相同的输出:(

以上是关于使用 C++ 的 Vigenere Cipher 存在输出问题的主要内容,如果未能解决你的问题,请参考以下文章

vigenere cipher 的 C++ 函数仅有时有效(适用于某些输入,跳过其他输入)

Vigenere Cipher使用命令行提示

Vigenere-cipher 错误输出

Vigenere Cipher - 解密(手动)

Java 中的 Vigenere/Polyalphabetic Cipher Decoder/Decrypter/Breaker

Vigenere Cipher - 解密(手动)