ラッパーをこれらの暗号化プログラムで動作させる方法を理解するのに苦労しています。暗号化と復号化の両方で機能する 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" です。私は明らかに何か間違ったことをしていますが、しばらくの間ソリューションに取り組んでいて、同じ結果を出し続けています。