我需要在允许 crypto agility 的各种操作模式下围绕对称密码(AES、DES 等)在 python 中编写一组包装器.具体来说,调用包装器的代码不需要了解实际保护数据的内容,因此可以动态更改它
基本上以下内容应该成立(无论这些是对象上的方法、单独的函数还是其他东西)
foo = MagicalEncryptor()
foo.ciphertext = foo.encrypt(data)
key = foo.key
bar = MagicalEncryptor()
bar.key = key
data = bar.decrypt(ciphertext)
问题是根据使用的模式不同,得到的密文也会不同。对于 CBC,它可能是 (MODE_CBC,IV,ciphertext),对于 GCM 模式,它可能是 (MODE_GCM,IV,ciphertext,mac)。
这显然违反了 Liskov substitution principle因为它使解密协变的论点。如果调用者持有通用 magicalEncryptor
接口(interface)的实例,而该实例恰好用于 GCM 模式,则它不能将 ECB 模式的实例传递给它。
对此有什么好的 pythonic 解决方案? (或者答案就是不关心?)对于我特别需要做的事情,它应该在 2.7 和 3.0 中都可以工作,但我对两者的解决方案都很感兴趣。
此外, key 必须具有比特流的简短表示形式(最多可能为 128 或 256 位)。这旨在用于混合加密方案,例如,可以发送 (RSA_ENC(PublicKey,symetric_key_as_message)||AES(symetric_key_as_message,actual_message)。
最佳答案
跟随 Kirk,但在最后一刻放弃,让多态 key 负责选择正确类型的解密器:
foo = MagicalEncryptor()
foo.ciphertext = foo.encrypt(data)
key = foo.key
bar = key.decryptor()
data = bar.decrypt(ciphertext)
它可以创建适当的解密器并将其自身传入。或者其他任何东西: key 和创建解密器之间的协议(protocol)是私有(private)的。
我什至可以重新安排这样的事情:
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)
关于避免违反 Liskov 替换原则的密码敏捷性的 Pythonic 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7918446/