-1

次の機能を実装したい:

  • 擬似乱数ジェネレーターとして Mersenne-Twister-Algorithm (ウィキペディアから) を使用しています。
  • ストリーム暗号です
  • 疑似コードは次のとおりです。encrypted text = CLEARTEXT XOR STREAM; 「ストリーム」は PSEUDORANDOM_NUMBER XOR KEY として定義されます

次の関数を書きました。

int encrypt(char clear[1000], char key[100], int lk/*length of the cleatext*/, int ls /*length of key*/) {
  int a, i;
  unsigned char result[1000];
  char string[1000];

  for (i = 0; i <= lk; i++) {
    if (i+1-ls >= 0) {          /*if the key is too short*/
      a = mersenne_twister();
      string[i]=key[i+1-ls]^a;      /*XOR */
    } else {
      a=mersenne_twister();
      string[i] = key[i]^a;     /*XOR */
    }
  result[i] = clear[i]^string[i];
  putchar(result[i]);
  }

  return 1;
}

しかし、機能が正しく動作しません。putchar読み取り不能なものを返します。私の間違いはどこですか?それともコード全体が間違っていますか?

4

2 に答える 2

1

xored他の何かでcharを印刷しようとすると、実際には奇妙な文字が表示されることがよくあります。たとえば、「M」を「P」とxorすると、「\ GS」(グループ区切り文字)になり、印刷できません。

于 2012-12-04T21:28:18.307 に答える
1

結果を文字として出力しません。それは文字ではありません: 疑似乱数バイトで文字を XOR しました。結果はバイトです。たまたま印刷できる場合もありますが、そうでない場合もあります。結果をバイトとして扱い、次のように出力する必要があります。

/* format a byte as 2 hex digits */
printf("%02X", result[i]);

また、注意事項を追加します。この「暗号」は使用しないでください。メルセンヌ ツイスターは、暗号的に安全な乱数ジェネレーターではなく、生成される暗号も安全ではありません。

ストリーム暗号を学習したい場合は、単純なバーナム暗号から始めて、RC4 について読んでください。どちらも理解しやすく、実装も簡単です。その結果、いわば足を濡らすのに適しています。

于 2012-12-04T21:44:26.537 に答える