Wir bewegen sich weg von pycryptodome
zu cryptography
zu Sicherheitsüberlegungen zurückzuführen. Wenn ich dieselbe Klartextzeichenfolge mit pycryptodome codiere, erhalte ich einen anderen Chiffretext als die Kryptografie. Beachten Sie den folgenden Code:
Pycryptodome:
def aes_encrypt(self, plain_text):
try:
plain_text_with_padding = self._aes_pad(plain_text).encode("utf-8")
cipher = AES.new(self.aes_secret_key, AES.MODE_CBC, self.aes_iv)
msg = cipher.encrypt(plain_text_with_padding)
return msg.encode("hex")
except Exception as e:
raise AesError(e.message)
Kryptographie:
def aes_encrypt(self, plain_text):
try:
plain_text_with_padding = self._aes_pad(plain_text)
encryptor = Cipher(
algorithm=algorithms.AES(self.aes_secret_key),
mode=modes.CBC(self.aes_iv),
backend=default_backend(),
).encryptor()
msg = encryptor.update(plain_text_with_padding) + encryptor.finalize()
return msg.encode("hex")
except Exception as e:
raise AesError(e.message)
@staticmethod
def _aes_pad(s):
padding_length = AES.block_size - (len(s) % AES.block_size)
return s + padding_length * chr(padding_length)
Der Testcode:
def setUp(self):
secret_manager = Mock()
secret_manager.get_secret.return_value = {
"hmac_secret_key": "secret",
"aes_secret_key": "fbc1f4bf4c826fc41d27905bc3eb8cbb",
"aes_iv": "J3wmcjV0Vzd9Jw=="
}
self.crypto_utils = CryptoUtils(secret_manager)
def test_aes_encrypt(self):
asset_id = "123456"
encrypted_asset_id = self.crypto_utils.aes_encrypt(asset_id)
self.assertEqual(
"926fbb0584c6e357157709e723b0e0d2",
encrypted_asset_id
)
Der gleiche Testcode besteht mit pycryptodome
, generiert jedoch bei Verwendung viel längeren Chiffretext cryptography
.
Jede Hilfe in dieser Angelegenheit wird geschätzt.
Das Problem schien die AES-Blockgröße zu sein - in der vorherigen Implementierung ( Pycryptodome
) ist sie angegeben, bytes
während sie in der neuen lib ( cryptography
) angegeben ist bits
.
Wenn Sie denselben Code mit den folgenden Änderungen ausführen cryptography
, werden die erwarteten Ergebnisse erzielt:
@staticmethod
def _aes_pad(s):
block_size_bytes = AES.block_size / 8
padding_length = block_size_bytes - (len(s) % block_size_bytes)
return s + padding_length * chr(padding_length)
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen