許可されていない人が自分のデータを変更したり読み取ったりしないように保護したいと思います。調べてみると、Authenticated Encryption(AE)が解決策であることがわかりました。
CCM、GCM、またはEAXのいずれかを使用してCrypto++でAEを実行できることを知っています。しかし、データの暗号化と復号化に同じキーを使用していることに気づきました。私はそれを望んでいません。データの暗号化と復号化に非対称鍵を使用したいと思います。
非対称アルゴリズムを使用してデータに署名し、次に対称アルゴリズムを使用して暗号化すると、目的の結果が得られます(AtE方式なので、どちらが安全でしょうか?)。
しかし、それを行う前に、私がすでに望んでいることを実行する暗号ライブラリはありますか?
3 に答える
CCM、GCM、またはEAXを使用して認証付き暗号化を実行できることはわかっています。しかし、データの暗号化と復号化に同じキーを使用していることに気づきました。私はそれを望んでいません。データの暗号化と復号化に非対称鍵を使用したいと思います。
私が知っているすべてのスキームは、バルクデータ暗号化に対称暗号を使用します。対称暗号は、ブロック暗号またはストリーム暗号にすることができます。
また、RSAがECBモードで動作するRSAの誤ったアプリケーションもいくつか見ました。つまり、データは「チャンク」または「ブロック」されてから、RSAが各ブロックに適用されます。応用暗号化ハンドブックは特にこれに対して警告しています。
おそらく最善の方法は、Elliptic Curve Integrated Encryption Scheme(ECIES)またはDiscrete Log Integrated Encryption System(DLIES)です。どちらもCrypto++で利用できます。どちらも公開鍵(非対称)暗号化を使用します。
ECIESとDLIESは、キーカプセル化メカニズム(KEM)とデータカプセル化メカニズム(DEM)を組み合わせたものです。システムは、共通の秘密から対称暗号鍵とMAC鍵を独立して導出します。データは最初に対称暗号で暗号化され、次に暗号文が認証スキームでMACされます。最後に、共通秘密は公開鍵と秘密鍵のペアの公開部分で暗号化されます。暗号化関数の出力はタプルです{K,C,T}
。ここK
で、は暗号化された共通の秘密、C
は暗号文、T
は認証タグです。
実際には鍵共有機能を適用し、後でKDFで消化した結果であるため、「共通の秘密」を回避する手があります。静的公開鍵と一時的な鍵のペアを使用します。復号化を実行する人は、公開鍵を使用して鍵交換の残りの半分を実行し、「共通の秘密」に到達します。
KEMとDEMはパディングを回避するため、オラクルのパディングは問題になりません。そのため、KDFはKEMの下で大きな「共通の秘密」を消化するために使用されます。パディングを省略すると、システムのセキュリティ証明が大幅に簡素化されます。セキュリティが証明されているため、ECIESとDLIESはIND-CCA2であり、これは達成できる最強の1つです。
非対称アルゴリズムを使用してデータに署名し、次に対称アルゴリズムを使用して暗号化すると...
ここにいくつかの関連する読み物があります...最初はHugoKrawczykの通信を保護するための暗号化と認証の順序です。2つ目は、S / MIME、PKCS#7、MOSS、PEM、PGP、およびXMLでのDonDavisの欠陥のある署名と暗号化です。
ここでの関連性は次のとおりです。Krawczykの論文は、対称鍵暗号化と、認証された暗号化のEncrypt-then-Authenticateスタイル(および認証された暗号化の実行方法)を扱っています。Davisの論文は、非対称暗号化と、署名と暗号化の間の切断(およびそれを修復する方法)を扱っています。
しかし、それを行う前に、私がすでに望んでいることを実行する暗号ライブラリはありますか?
はい(ただし、何をしたいかによって異なります)。Crypto ++は、ECIES、DLIES、およびPSSRのコレクションを提供することを私が知っている唯一のものです。
弾む城はECIESを提供しますが、DLIESは提供しないため、2番目に近いです。PSSRがいくつ提供されているかわかりません。
Crypto ++、Bouncy Castle、OpenSSL(およびその他)がPSSRを提供します。PSSRでlibを見つけるのに問題はないはずです。
OpenPGPベースのソリューションを検討することもできます。これにより、必要な機能が提供され、純粋に非対称暗号化(トランスポートキーなし)に基づくソリューションとは異なり、任意のデータサイズをサポートするように拡張できます。
そこにいくつかのオープンソースの実装があります。BouncyCastleは1つ提供していますが、C++実装があるかどうかはわかりません。
GPGME(GnuPG Made Easy)。これはCの高レベル暗号化ライブラリであり、LGPLライセンスが付与されています。