1

私は、エンド ユーザーがブラウザからクイズを受けられるようにするアプリケーションを設計しています。要件の一部は、クイズの開始時間になったら、質問をすべての参加者に一度に表示する必要があることです。これにより、サーバーからエンドユーザーに質問を提供することは合理的ではなくなります。これにより、リクエストが突然バーストすることにつながるため、接続したらすぐに質問を提供し、クイズの開始時間まで 2 時間以内にするつもりです。問題は、競技であるため、質問は開始時間までに表示されるべきではないため、暗号化する必要があることです.

私は 2 段階で暗号化することに決めました。暗号化の最初の段階では、キーの交換に非対称 RSA 暗号化を使用し、成功しました。このキーは、サーバーとクライアントの間で送信されるその他のデータを暗号化するために使用されます。

問題は対称暗号化の部分です。openssl_encrypt メソッドを使用してサーバー側で暗号化し、クライアント側で pidcrypt (javascript 暗号化/復号化ライブラリ) で復号化しようとしています。pidcrypt では iv (初期化ベクトル) の長さが 8 バイトである必要があることが判明しましたが、AES-256-CBC モードを使用する openssl_encrypt では 8 バイトが許可されず、代わりに常に 16 バイトが要求されます。私は多くの順列と実験を行ってきましたが、うまくいきませんでした。pidcrypt のドキュメントには、openssl と互換性があると記載されていたので、私の質問は、何が間違っているのでしょうか? 以下は、PHPを使用してサーバー側で暗号化するコードです

        $iv_len = openssl_cipher_iv_length("AES-256-CBC");
            $key='My very secret key.......';
    $iv = openssl_random_pseudo_bytes($iv_len);
    $enc = openssl_encrypt('Hello', "AES-256-CBC", $key, 0, $iv);
    $encryptedMessage = base64_encode("Salted__".bin2hex($iv).$enc);
    echo json_encode(array('key'=>$key, 'encrypt'=>$encryptedMessage,));

このコードが常に返す 16 バイトではなく、$iv_len を 8 バイトにする方法はありますか? このセットアップ全体に正しい方法でアプローチしていますか? ありがとう

4

1 に答える 1

0

pidcrypt8 バイトの IV を使用せず、8 バイトのソルトを使用します。IV とソルトは、多くの類似点を共有していますが、異なる概念です。

ランダム化されたソルトはpidcrypt、パスワードと MD5 と共に使用され、キーと IV を生成します。次に、salt が暗号文の前に追加されます (openssl と同様)。サーバーは、前に保留されたソルト値と共有パスワードを使用して、同じ方法を使用してキーと IV を生成する必要があります。現在、キーと IV を直接使用しようとしていますが、これは正しくありません。

ライブラリが何であれ、CBC モードの復号化に使用される IV は、基礎となる暗号のブロック サイズと同一である必要があります。ここでの基礎となるブロック暗号は AES です。つまり、IV は常に 16 バイトになります。

文書化されていない方法に関するユーザーのコメントを注意深く読んでから、openssl_encryptおそらく PHP で別の openssl 互換ライブラリを見つけるか、OpenSSL キー導出方法 ( EVP_BytesToKey)を見つけて実装する必要があります。

opensslコマンド ライン ユーティリティによって次の出力が生成されることに注意してください。

00000000  53 61 6c 74 65 64 5f 5f  44 a2 2f ee ac ee 94 fd  |Salted__D./.....|
00000010  6f 93 17 24 44 12 88 66  e7 fe 5c d5 7d 81 fe d9  |o..$D..f..\.}...|
00000020

つまり、これSalted__は 8 バイトのランダムなソルト (IV ではない) と 16 バイトの暗号文 (1 つの完全なブロック) を含む ASCII 文字列です。

于 2013-08-07T20:58:13.850 に答える