1

同じキーとivを使用してPHPとRubyで文字列を暗号化しようとしましたが、常に異なる結果が得られました。

以下はPHPコードです

$data = "This string needs to be encrypted";

$key = "1234567887654321abcdefghabcdefgh";

$iv = "1234567887654321abcdefghabcdefgh";

echo $encrypted_data = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv);

以下はRubyコードです

data = "This string needs to be encrypted"

key = "1234567887654321abcdefghabcdefgh"

iv = "1234567887654321abcdefghabcdefgh"

aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.encrypt
aes.key = key
aes.iv = iv
encrypted_data = aes.update(data) + aes.final

PHPとRubyで同じ暗号化データを取得するのを手伝ってくれませんか?一部のデータをPHPで暗号化してから、Rubyで復号化しましたが、データが返されませんでした。したがって、問題はPHPとRubyの暗号化と復号化のメカニズムの動作が異なることだと思います。私が間違っている場合は訂正してください。ありがとう

4

1 に答える 1

3
  1. IV をハードコーディングしないでください。安全ではありません。IV はランダムである必要がありますが、 public にすることができるため、
    mcrypt_create_iv を使用して暗号文の前に追加し、復号化する前に抽出します

  2. あなたはおそらく3つの問題を抱えています

    1. MCRYPT_RIJNDAEL_256 は AES ではありませ。AES は、128 ビットのブロック サイズと 128 または 256 ビットのキーで標準化された特定のバージョンの RIJNDAEL です。MCRYPT_RIJNDAEL_256 は、ブロック サイズが 256 ビットの RIJNDAEL です。実際には AES である MCRYPT_RIJNDAEL_128 を使用します。PHPの場合、キーの長さはキーの長さによって決まります。したがって、256 ビット (32 文字) のキーを指定するだけで問題ありません。ブロックサイズは実際にはセキュリティに影響しないことに注意してください。したがって、違いについて心配する必要はなく、256 ビットの鍵で AES を使用してください。NSA と極秘データには十分です。
    2. パディング。AES は固定の 128 ビット チャンクしか使用しないため、そのサイズの倍数になるようにテキストをパディングする必要があります。PHP はそれほど悪くなく、SSL は pkcs7 パディングを使用していると思います。パディング スキームが異なっていても、ほとんどの場合、暗号化テキストの開始は同じである必要があり、最後にゴミが存在する可能性があることに注意してください。

    3. 文字列エンコーディング。AES はビット入力で定義されます。c では通常、これはバイト配列です。Ruby と PHP は文字列を使用します。あなたの文字列エンコーディングが異なっていることは間違いありません。

于 2012-04-16T20:41:53.797 に答える