0

コードを機能させようとして、いくつかの問題が発生しています。ほとんど正しいデータを出力しますが、正しくループしていない可能性がありますか? アルファベットでキーを繰り返すとは思いません。すべて小文字で、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に変更する必要があります

4

2 に答える 2

0

みんな (特に自分自身) のためstd::stringに、C スタイルの文字列の代わりに使用してください。次に、自分でループを台無しするのではなく、標準のアルゴリズムを使用します。

#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;
}
于 2014-02-04T07:01:31.180 に答える
0

あなたのループは一対一です。<= の代わりに < を使用する必要があります。そして、> =ではなく> 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;
}
于 2014-02-04T06:45:15.247 に答える