2011-10-27 5 views
2

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)を送信することがあり、ハイブリッド暗号化方式で使用されることを意味している

答えて

1

が、最後の最後で剥離し、多形をしましょう。キーは、正しい種類を選択する世話をする暗号解読の:

foo = MagicalEncryptor() 
foo.ciphertext = foo.encrypt(data) 
key = foo.key 

bar = key.decryptor() 
data = bar.decrypt(ciphertext) 

それは適切な復号化を作成することができますし、中に自分自身を渡すか何か:キーと暗号解読の創造の間のプロトコルはプライベートです。

key = createMagicalKey() 

foo = key.encryptor() 
ciphertext = foo.encrypt(data) 

bar = key.decryptor() 
data = bar.decrypt(ciphertext) 

をそしてもちろん、それはへの唯一の簡単なステップです:

私もこのようなものを並べ替える可能性があることがなるため

key = createMagicalKey() 

ciphertext = key.encrypt(data) 

data = key.decrypt(ciphertext) 
+0

まともな溶液です。残念ながら、私が上記で明確にしたように、キーはRSA \ DSA \もっとエキゾチックなもののようなもので自分自身を暗号化する必要があるので、基本的にビットストリーム表現が合理的に短くなければなりません。たぶん128または256ビットでしょう。 – imichaelmiers

+0

私の提案は短いビットストリーム表現と互換性がないとは思わない。これはプロトコルのフォーマットではなく、APIの設計です。私はあなたが魔法の鍵か何かのバイトコードを送らなければならないと言っているわけではありません - それはどんな種類の魔法の鍵かと言う何らかの種類のタグです。受信機があなたと同じタグのセットを知っているならば、それはです。 –

0

方法1:強力に暗号化されたデータを入力します。

class GCMData(object): 
    def __init__(self, data): self.data = data 

    def __str__(self): return self.data 
    __repr__ = __str__ 


class MagicalGCMEncryptor(object): 
    def encrypt(self, data): 
     return GCMData(self._encrypt(data)) 

    def decrypt(self, dataobj): 
     if not isinstance(dataobj, GCMData): 
      raise ValueError('Only decrypts GCM data') 

方法2:反転フロー制御、暗号化されたデータを格納するデータ・オブジェクトを作成し、データを暗号化するクラスを作成しないでください。カーク後

class GCMEncryptedData(object): 
    def __init__(self, data): 
     self.data = [... do something with data] 

    def __str__(self): return self.data 
    __repr__ = __str__ 

    def decrypt(self): 
     return [... do something with self.data] 
+0

私は、フロー制御を反転しても問題が解決していることはよく分かりません。それでも正しい種類の鍵を渡すように注意する必要があります。 –

+0

解決策1は、liskov置換の問題を明示的にしているようです。 MagicalGCMEncryptorはMagicalEncryptorのサブクラスではありません。 解決策2は大通りですが、@TomAndersonによれば、キーでいくつかの問題が発生します。さらに、それは他の言語との相互作用を困難にし、3)データのシリアル化を解除することは面白い問題です。まず、ピックルを使用することはできません。 – imichaelmiers

0

「これは非常に明確にリスコフの置換原則に違反しますGCMモードで使用される汎用magicalEncryptorインターフェイスのインスタンスを呼び出し元が保持している場合、ECBモードのインスタンスを渡すことはできません。

それもありません。暗号化はモードに依存しないブラックボックスにすることはできません。はい、あなたはより多くの高水準ロジックを変更することなくAES-256とTDESを交換できますが、暗号化の変更には当てはまりません。モード。モードをプロトコルとし、アルゴリズムをエンジンと考えてください。プロトコルは、それ自身の特別なエラー報告、故障メカニズム、初期化手順、関連データ、状態情報などを必要とするため、複雑である。対照的に、アルゴリズムエンジンの交換は容易である。GCMを使用しているとき

たとえば、あなたはあまりにも多くのメッセージを暗号化し、お使いのMacの暗号の強度を維持するために、より迅速にあなたの鍵を回転させることはありません世話をする必要があります。 TDES-GCMでもAES-256-GCMでもそうです。それはあなたが暗号化されているどのように多くのメッセージを追跡するべきであることを意味 - (。あなたが本当に処理されるデータの量を気にしないが)、これは、このような「モードYを使用した場合、すべてのX日をリキー」として球場の見積もりをされた場合でも

これらの懸念事項は(実際的なレベルでは)ECBにはありませんが、情報漏洩に関するさまざまな懸念があります。

CBCモードでは、また、CBC-MACを使用している場合は特に、独自の使用方法の落とし穴があります。使用される認証方法によっては、MACに障害が発生したときのエラーメッセージの報告に注意する必要があります。場合によっては、MACの障害によってキー(たとえばセッションキー)が破損する可能性がありますが、 MACは、プロトコルの実行をリセットするだけです(認証鍵セットを保持する)。あるいは、おそらくメッセージを再生することができます。これはプロトコルの構築方法と使用しているアルゴリズムによって異なります。

保存されたデータに調整モードを使用している場合、データがディスク上のどこにあるか気になり、ブロックを上書きする場合は同じ調整キーと位置の値を再利用します。ただし、チャネルを暗号化している場合は、同じセッション鍵でメッセージカウンタを再利用することはありません。データの位置を暗号化するのに適した暗号化モードは、チャネルを暗号化するのに適した暗号化モードと重複しない。彼らはお互いに交換することはできません。

あなたが考えられるすべてのデータ保護プロトコルに特化することができ、一般的な「セキュリティ」オブジェクトを実装しようとしない限り、すべてのことは、リスコフの置換原則に違反します。

*これまでのところ、2つの異なるモードまたは2つの異なるアルゴリズムエンジンで同じキーを使用します。

なぜキーオブジェクトのインスタンスが複数のアルゴリズムの実装に特化したことを可能にするようにコードを設計?あなたのセキュリティチームはあなたのコードを取り戻し、攻撃者が誤った方法でアプリケーションを使用してキーを乱用するような穴をあけないようにします。戻って、キーをインスタンス化するときに、キーのコンストラクターで使用されるモードとアルゴリズムを完全に指定する必要があります。キーの長さの問題に戻ります。それ以降にインスタンス化された異なるアルゴリズムまたはモードでキーを使用しようとすると、重大なエラーが発生します。

その場合、基礎となるシステムが新しいアルゴリズムを採用するたびに、ユーザーまたはアプリケーションが新しいキーを作成したり、既存のデータを元に戻す必要がある場合、「アルゴリズムの敏捷性」とはどういう意味ですか?

関連する問題