AES-Verschlüsselung in Python - unterschiedliche Ergebnisse bei Verwendung von Pycryptodome und Kryptografie

Ohad Benita

Wir bewegen sich weg von pycryptodomezu cryptographyzu 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.

Ohad Benita

Das Problem schien die AES-Blockgröße zu sein - in der vorherigen Implementierung ( Pycryptodome) ist sie angegeben, byteswä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.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

TOP Liste

  1. 1

    So verschieben Sie ein Bild in Flutter/Dart mit einem Draggable

  2. 2

    Unity Build-Fehler: Der Name 'EditorUtility' ist im aktuellen Kontext nicht vorhanden

  3. 3

    TypeAhead.js zeigt keine Ausgangsschienen an?

  4. 4

    Deklarieren einer nicht initialisierten Variablen in der Klassendefinition in Python

  5. 5

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  6. 6

    Interpolieren Sie mit Python die 2D-Matrix entlang der Spalten

  7. 7

    spring-data-jpa: ORA-01795: Die maximale Anzahl von Ausdrücken in einer Liste beträgt 1000

  8. 8

    Warum funktioniert Phantomjs nicht mit dieser Site?

  9. 9

    numpy: Berechnen Sie die Ableitung der Softmax-Funktion

  10. 10

    Wie vermeide ich, dass die gesamte App neu geladen wird, wenn Nav.Link von React-Bootstrap verwendet wird?

  11. 11

    MongoDB eingebettetes Dokument unterscheiden und filtern

  12. 12

    Warum funktioniert das Umgebungslicht in diesem Beispiel nicht?

  13. 13

    Wie aktualisiere ich ein Feld in einer Raumdatenbank mit einem Repository und einem Ansichtsmodell?

  14. 14

    Python gibt einen Fehler aus, dass eine Datei nicht vorhanden ist, wenn dies eindeutig der Fall ist

  15. 15

    Aktualisieren des Werts im Json-Objekt in Python

  16. 16

    Wie verwende ich Format-Table ohne Abschneiden von Werten?

  17. 17

    Kivy: Machen Sie Scatter gleich groß wie das untergeordnete Etikett oder Bild

  18. 18

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  19. 19

    So vergleichen Sie Werte in verschiedenen Objekten jq

  20. 20

    Teilen Sie die Zeichenfolge durch (') und Leerzeichen, aber lassen Sie alle Leerzeichen zwischen zwei aufeinander folgenden (')

  21. 21

    Überprüfen Sie, ob der ausgewählte Wert 'YES' ist, wenn ja, aktivieren Sie ein Steuerelement mit Javascript

heißlabel

Archiv