-1

Caesar 暗号では、プログラムから読み取られた暗号化されたテキスト ファイルのシフト量をどのように検出し、その一定量を表示するのか疑問に思っていました。ありがとうございました!EDIT** argv[2] の smallDictionary ファイルも読み込みました。回転機能:

  int rotate(int c, int n){
if (n == 0) return c;
int nRot = abs(n) % (RANGECHAR + 1);
if(n > 0)
return rotatePlus(c + nRot);
else
return rotateMinus(c - nRot);
}





int main( int argc, char *argv[]){

FILE *fp = stdin;  // defaults
int  n = 13;
int shift;
int i = 0;
// process command line
switch(argc) {
case 2: // only have n, assumed input from stdin
n = atoi(argv[1]);
break;
case 3: // have n and input file 
fp = fopen(argv[1], "r"); // should check for problems
n  = atoi(argv[2]);
break;
default:
fp = stdin;
n  = 13;
}
// rotate text
int c;
while( (c = fgetc(fp)) != EOF){
if(!isspace(c)){
 c= rotate(c,n);

}
i++;
    printf("%c", c);
}

fclose(fp);
}
4

1 に答える 1

3

array の形式で提供される言語 (おそらく英語) の分布データが必要になりますint lang_distribution[26]int doc_distribution[26]次に、テキストから取得したデータで埋められるような別の配列を作成する必要があります。どちらも正規化して、文字の相対的な出現を表す必要があります。

次のステップは、を からにdoc_distribution整数だけシフトすることで構成され、シフトごとに、プログラムはwhereの合計を測定する必要があります。差の合計が最小のシフトは、暗号のコードです。これはすべて、ネストされた 2 つの要素によって実装できます。トリッキーな部分はループでのインデックス付けかもしれませんが、モジュロ演算子を使用することでおそらく適切な結果を得ることができます.025abs(lang_distribution[x] - doc_distribution[x])x belongs to <0,25>for()%

于 2015-03-28T23:04:38.553 に答える