秘密鍵を安全に保管したいモバイル アプリケーションがあります。セキュリティ要件は、たとえ攻撃者がモバイル デバイスに無制限にアクセスできたとしても、秘密鍵を取得することは非常に困難であるべきであることを意味します。このレベルのセキュリティを実現するために、アプリケーションは、ユーザーが指定したパスフレーズとデバイス固有のソルトから派生したキーを使用した対称暗号化を採用しています。
理想的には、これは総当たり攻撃に対して十分に安全であるべきです。ただし、2 つの制限要因があります。
秘密鍵は特定の形式に準拠する必要があるため、復号化プロセスはプロセスの結果をテストして、有効かどうかを確認できます。たとえば、秘密鍵が RSA 秘密鍵である場合、攻撃者はパスフレーズのさまざまな組み合わせを試し、結果の平文を有効な RSA 秘密鍵として使用できるかどうかをテストします。RSA 秘密鍵は特定の情報を特定の方法でエンコードする必要があるため、復号化に失敗すると、RSA エンジンは鍵が無効であることを通知します。これにより、攻撃者は完全にオフラインで攻撃を検証できます。できれば、攻撃者は、サーバーと通信せずに、復号化の試みが成功したかどうかを判断できないようにする必要があります。
アプリケーションはモバイル デバイス上で実行されるため、モバイル デバイスに完全にアクセスできるオフライン攻撃は、より豊富なリソースを備えたより機能的なデバイスで実行される可能性が高いため、鍵派生関数の複雑さが増しても鍵の強化には役立ちません。すぐに、キー派生関数の計算ラウンド数が増加すると、ユーザー エクスペリエンスが遅くなります (これは一定の制限内で許容されます) が、デスクトップ コンピューターで攻撃が実行された場合はすぐに阻止されます。
これらの問題の解決策を誰かに教えてもらえますか? 具体的には、秘密鍵が任意のランダムなバイト シーケンス (固定長のシーケンスである可能性がありますが、問題ではありません) であり、アルゴリズムが暗号文を生成できる非対称暗号化アルゴリズムを知っている人はいますか?