避免违反 Liskov 替换原则的密码敏捷性的 Pythonic 解决方案

标签 python oop encryption

我需要在允许 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/

相关文章:

java - 有魔法变量是不是很糟糕?

encryption - 这个简单的 NodeJS 加密函数有什么问题吗?

python - 通过 Nose 运行扭曲的单元测试?

Python从配置创建字典的字典

python - 在 Google 应用引擎 Python 中提供静态 html

python - 在对象的第二次初始化时,为什么 __init__ 在 __del__ 之前被调用?

JavaScript 库模板

java - 如何像 SecretKeySpec 一样加密 ruby​​ 中的数据?

security - x.509 V3 扩展 Basic Constraints 和 Key Usage 创建 CA 证书的区别是什么?

python - 填充 PDF 文件 - Python