我需要在各種操作模式,允許crypto agility圍繞對稱密碼(AES,DES等)在Python中編寫一套包裝。具體來說,調用包裝器的代碼不需要知道實際上保護數據的內容,因此它可以動態更改,因此它可以動態更改。Pythonic解決密碼敏捷,避免違反Liskov的替代原則
基本上,以下內容應該成立(無論這些對象是方法,獨立函數還是別的東西)
foo = MagicalEncryptor()
foo.ciphertext = foo.encrypt(data)
key = foo.key
bar = MagicalEncryptor()
bar.key = key
data = bar.decrypt(ciphertext)
問題是,根據使用的模式,最終的密文將是不同的。對於GCM模式,它可能是(MODE_CBC,IV,密文)或(MODE_GCM,IV,密文,mac)。
這非常明顯違反了Liskov substitution principle,因爲它使參數解密協變。如果調用者持有正常情況下適用於GCM模式的通用magicalEncryptor
接口的實例,則無法將其傳遞給ECB模式的實例。
什麼是一個很好的pythonic解決方案呢? (或者答案根本就不在乎?)對於我特別需要做的事情,它應該同時適用於2.7和3.0,但我對兩種解決方案都感興趣。
此外,鍵必須有一個短的表示法作爲一個比特流(可能最多128或256位)。這意味着在混合加密方案,其中,例如,一個可以發送(RSA_ENC(公鑰,symetric_key_as_message)|| AES(symetric_key_as_message,actual_message)的使用
一個體面的解決方案。不幸的是,正如我剛剛澄清的那樣,密鑰基本上必須具有相當短的比特流表示,因爲它們需要使用類似RSA \ DSA \的更加奇特的東西進行加密。最多可能是128或256位。 – imichaelmiers
我不認爲我的建議與短比特流表示不兼容;這是一個API設計,而不是協議格式。我並不是說你必須發送魔法鑰匙的字節碼或任何東西 - 只是某種標籤說明它是什麼樣的魔法鑰匙。只要接收者知道與您相同的一組標籤,就是說。 –