crypto agilityを可能にするさまざまな操作モードで対称暗号(AES、DESなど)の周りにPythonでラッパーのセットを書く必要があります。具体的には、ラッパーを呼び出すコードでは、データを実際に保護しているために、データを動的に変更できるようにする必要はありません。Liskovの置換原則に違反することを避ける暗号の敏捷性に対するPythonicの解決
基本的に以下のようにします(オブジェクト、別々の関数、
foo = MagicalEncryptor()
foo.ciphertext = foo.encrypt(data)
key = foo.key
bar = MagicalEncryptor()
bar.key = key
data = bar.decrypt(ciphertext)
問題は、使用されるモードによって結果の暗号文が異なることです。 CBCの場合は(MODE_CBC、IV、暗号文)、GCMモードの場合は(MODE_GCM、IV、ciphertext、mac)です。
Liskov substitution principleこれは、共変を解読する引数を作成するため、非常に明確にLiskov substitution principleに違反しています。呼び出し元がGCMモードである汎用magicalEncryptor
インタフェースのインスタンスを保持している場合、それをECBモードのインスタンスに渡すことはできません。
これにはいいpysonic解決策がありますか? (あるいは気にしない答えは?)私が特に必要とすることは、2.7と3.0の両方で動作するはずですが、どちらの解決策にも興味があります。
また、キーはビットストリームとして表現する必要があります(おそらく最大128または256ビット)。これは、例えば、1は(RSA_ENC(のPublicKey、symetric_key_as_message)|| AES(symetric_key_as_message、actual_message)を送信することがあり、ハイブリッド暗号化方式で使用されることを意味している
まともな溶液です。残念ながら、私が上記で明確にしたように、キーはRSA \ DSA \もっとエキゾチックなもののようなもので自分自身を暗号化する必要があるので、基本的にビットストリーム表現が合理的に短くなければなりません。たぶん128または256ビットでしょう。 – imichaelmiers
私の提案は短いビットストリーム表現と互換性がないとは思わない。これはプロトコルのフォーマットではなく、APIの設計です。私はあなたが魔法の鍵か何かのバイトコードを送らなければならないと言っているわけではありません - それはどんな種類の魔法の鍵かと言う何らかの種類のタグです。受信機があなたと同じタグのセットを知っているならば、それはです。 –