私は、エンド ユーザーがブラウザからクイズを受けられるようにするアプリケーションを設計しています。要件の一部は、クイズの開始時間になったら、質問をすべての参加者に一度に表示する必要があることです。これにより、サーバーからエンドユーザーに質問を提供することは合理的ではなくなります。これにより、リクエストが突然バーストすることにつながるため、接続したらすぐに質問を提供し、クイズの開始時間まで 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 バイトにする方法はありますか? このセットアップ全体に正しい方法でアプローチしていますか? ありがとう