2 に答える
データの整合性をテストするには、メッセージ認証コード(MAC) が必要です。
キーを持つハッシュ関数のように見えるスタンドアロンの MAC アルゴリズムがいくつかあります。非常に標準的な MAC アルゴリズムはHMAC (ハッシュ関数を使用) です。
データも暗号化するため、MAC が組み込まれた暗号化モードを使用する必要があります。GCMやEAXなど、そのようなモードがいくつかあります。これらのモードはブロック暗号、通常はAESに適用されます。
暗号化の前に既知のプレフィックスまたはサフィックスをデータに追加することは、自家製の MAC です。MAC はわかりにくく、エラーが発生しやすいです。たとえば、CRC32 を追加してからストリーム暗号 (または CTR モードのブロック暗号) で暗号化すると、WEP の 7 つの大罪の1 つが再現されます(特にセクション 4 を参照してください。CRC32-as- MACの問題)。基本的に、整合性チェックはアクティブな攻撃に対して耐性がなくなりました。間違ったキーを使用するなど、無害な間違いを検出するだけです。
(残念ながら、MCrypt は暗号化/MAC モードの組み合わせをサポートしていないようです。PHP 自体は、--with-mhashオプションを指定してコンパイルすると、mhash()生のハッシュと HMAC の両方を実装する関数を提供します。)
文字列が適切に復号化されたことをテストするにはどうすればよいですか?
「小さなプレフィックス」のアイデアは問題ありません。また、@CodeInChaos による優れたアイデア。それ以外に、文字列を定義された形式 (serialize()または などjson_encode()) で保存し、復元に失敗した場合 ( unserialize()、json_decode()) も、復号化が壊れていることを示します。