2

TripleDESを使用してテキストのブロックを暗号化するためにmcrypt関数を使用しています。90%の確率で正常に動作し、正常に復号化できます。残りの10%は、まったく復号化できませんが、キーが間違っているか、データが壊れているかのように見えます。

機能は次のとおりです。

function enc($text, $key, $iv) {
  $text_num = str_split($text, 8);
  $text_num = 8 - strlen($text_num[count($text_num)-1]);

  for ($i=0; $i < $text_num; $i++) {
    $text = $text . chr($text_num);
  }

  $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', '');
  mcrypt_generic_init($cipher, $key, $iv);
  $decrypted = mcrypt_generic($cipher, $text);
  mcrypt_generic_deinit($cipher);
  return base64_encode($decrypted);
}

キーとIVは正しい長さ(それぞれ24/8)であり、変更されることはありません。私が言ったように、それはすべてでまったく同じコードを実行しますが、この方法で失敗するのはわずか10%です。

$textこれを引き起こしている私が渡すことができる何かがありますか?特定の文字セットが好きではありませんか?または、これはメモリ不足/その他のサーバーの状態が原因で発生する可能性がありますか?

これを特定するための助けをいただければ幸いです。ありがとう!

4

1 に答える 1

0

(コメントからコピー)3DESのブロックサイズは64ビット(8バイト)です。ブロック数の観点から平文を確認するには、平文の正確なサイズを確認する必要があります。パディング、おそらくPKCS5またはおそらくPKCS7についての言及については、ドキュメントを参照してください。あなたの「10%」の失敗は実際には12.5%の失敗(8分の1)ですか?それはブロッキングに関連する何かを指す傾向があります。

于 2011-08-27T21:46:28.693 に答える