1

次のコードは、別の読み取り可能なテキスト ファイルから派生したエンコードされたメッセージを含むテキスト ファイルを生成します。

   #include <stdio.h>
   #include <time.h>
   #include <stdlib.h>

   main()
   {
     FILE *f, *f_enc;
     char c, c_enc;
     int ind, a[26], r_val;

     srandom(time(NULL));
     for (ind=0; ind<26; ind++) a[ind]=-1; 
     for (ind=0; ind<26; ind++){
       do
         r_val=random()%26;
       while (a[r_val]!=-1);
       a[r_val]=ind;
     }

     f=fopen("plain.txt","r");
     f_enc=fopen("cipher.txt","w");
     while (!feof(f)) {
       c=fgetc(f);
       if ((c>='A' && c<='Z')||(c>='a' && c<='z')) {
         if (c>='A' && c<='Z') c = c + 'a' - 'A';
         c=a[c-'a']+'a';
       }
       fputc(c,f_enc);
     }
     fclose(f);
     fclose(f_enc);
   }

私が不明なのは、コードがメッセージをエンコードするために実装している全体的なアルゴリズムです。

  • エンコードされた文字を生成するために、文字から ASCII 値 ('a - 'A) を減算していますか?

出力例を以下に示します。

xohq xpu ouuf yubliu spieqxkhq, hzj hcc xpilnap xpu plnqu
tln slncj puhi ku yuhxeza xpu slkmnxui oexp xpu klnqu.
xpu jeqf ohq pnza nm ez xpu jeqf jieru oexp shiu,
hzj, zuujcuqq xl qht, e zuhict mnccuj lnx kt phei.

e ahru nm bli xphx zeapx, alx iuhjt bli yuj,
hzj olzjuiuj, "qplncj e gnqx ynt shijq ezqxuhj?"
khkh hzj jhjjt phj gnqx pex xpu pht,
ql e xlcj xpuk allj zeapx, hzj ouzx lz kt oht.

これをリバースエンジニアリングして、何が起こっているのかを把握できるかどうかを確認します。どんな憶測でも大歓迎!

4

1 に答える 1

4

これは、暗号パズルで使用されるような単純な置換です。文字頻度分析で解決できます。

自動ソルバーが存在します。例の元のテキストは次のとおりです。

それはクリスマスの前の週で、私がマウスでコンピューターを叩いているのが家中に聞こえました。ディスクは慎重にディスクドライブに吊るされ、言うまでもなく、私は髪を引っ張りそうになりました。その夜はあきらめて、寝る準備をして、「代わりにカードを買うべきか」と考えました。ママとパパは干し草を食べたばかりだったので、おやすみなさいと言って帰りました。

于 2012-12-03T16:52:16.080 に答える