0

ラッパーをこれらの暗号化プログラムで動作させる方法を理解するのに苦労しています。暗号化と復号化の両方で機能する Caesar 暗号プログラムを取得しました。現在、Vigenere 暗号に取り組んでいます。プログラムは動作していますが、文字が折り返されるキーを使用すると、奇妙な結果が得られます。私が使用しているコードは次のとおりです。

int main(int argc, char *argv[])
{
    char s2[25];
    strcpy(s2, argv[1]);
    printf("Please enter a string of text to be encrypted!\n");
    string p = GetString();
    for (int i = 0, n = strlen(p); i < n; i++)
    {
        if (isupper(p[i])){

        char c = (p[i] - 'A' + s2[i]);
        printf("%c", c);
        }
    }
    printf("\n");

}

このコードは、コマンド ライン入力が./program BACONで、テキストを暗号化するために BLAH を入力した場合に機能します。たとえば./program ZZZZZ、キーとして使用すると、ラップアラウンドしないため、あらゆる種類の奇妙な結果が得られます。モジュラス演算子を使用してみましたが、投稿したばかりのコードから除外しました。これでラップすることができなかったからです。プログラミングを学び始めたばかりです。

アップデート

数学をよりよく理解するのを手伝ってくれるかもしれません。あなたのコードは完全に機能しますが、何が起こっているのかを確認するためだけに、電卓でこれを手動で理解しようとしています。これは私がこれまでに持っているものです:

./program HHHHH

私の理解ではkeyLenは5に等しくなければならないので、p[i]に「H」の値を与えると

keyLen= 5
p[i]= H   //or 72 in ASCII 
int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A'); //sum = (72 - '65') + ([72 % 5] - '65');
char c = 'A' + sum%26; // c = 65 + -11

たぶん、私の数学はかなりずれていると思います。なぜなら、私が順番に物事を行うとき、合計 = 負の 63 とすべきだと思うからです。したがって、-63 の 26 mod は、負の 11 になります。 65 とマイナス 11。

負の 11 を 11 の正の整数にして 65 を足しても、ASCII 文字の "L" である 76 が得られますが、正解は "O" です。私は明らかに何か間違ったことをしていますが、しばらくの間ソリューションに取り組んでいて、同じ結果を出し続けています。

4

1 に答える 1

2

プログラムには 2 つの「ラップアラウンド」の問題があります。

  • キーと現在の文字を組み合わせて 26 を超える値を生成しても、文字は折り返されません。
  • 暗号化されている単語の長さがキーの長さを超える場合、キーの末尾を超えて読み取ります。

これを修正する方法は次のとおりです。キーを にコピーした直後に、次の操作s2を行います。

int keyLen = strlen(s2);

ループ内でこれを行います:

int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A'); // Calculate the sum of key+word
char c = 'A' + sum%26; // Wrap around at 26, the number of letters in the alphabet

これにより、出力が「通常」に見えます。

最後の式がどのように機能するかを理解したら、それを変更して単語をデコードできるはずです。

于 2012-10-19T03:56:45.907 に答える