Python AES decodeert stringuiteinde met verschillende char

Ik heb een input string en ik codeer het met MySQL's AES_ENCRYPT en dan decrypteren met python (niet MySQL AES_DECRYPT ). Ik heb een aantal tests van de gedecodeerde tekenreeks afgedrukt:

print decrypt_string
print "%sxxx" % decrypt_string
print len(decrypt_string)
print self.toHex(decrypt_string)

Wanneer de lengte van de ingevoerde string 8 is, d.w.z. abc defgh, zal de testoutput zijn:

abcdefgh
xxxdefgh
16
0x610x620x630x640x650x660x670x680x80x80x80x80x80x80x80x8

Als de lengte van de ingevoerde tekenreeks 7 is, d.w.z. abcdefg:

abcdefg                                 
abcdefg                                 xxx
16
0x610x620x630x640x650x660x670x90x90x90x90x90x90x90x90x9

Ik kwam erachter dat het eindkarakter geleidelijk afneemt terwijl de lengte van de invoerstring toeneemt. Waarom is er een verschil? Als ik PHP AES-codering gebruik in plaats van MySQL AES_ENCRYPT, is het einde van het teken 0x00. Ik gebruik een python AES lib van een derde partij .

1
probeer te coderen/decoderen met behulp van uw sleutel met m2secret ( pip install m2secret )
toegevoegd de auteur jfs, de bron
Ik raad af om een ​​bibliotheek te gebruiken die zegt: Ik ben onlangs geïnteresseerd geraakt in Python en had een "beginner" -project nodig om me vertrouwd te maken met de basis van de taal. voor cryptografie.
toegevoegd de auteur Paŭlo Ebermann, de bron

1 antwoord

De reden voor uw waarneming is dat AES een blokcijfer is, dat alleen gegevens in blokken van 128 bits (= 16 bytes) kan coderen. Om dit te doen, wordt het normaal gesproken gebruikt met een werkingsmodus (om grotere stukjes data te versleutelen) en een opvulmodus. Het lijkt erop dat je python-decoderingsfunctie het decoderen uitvoert, maar maakt de vulling niet ongedaan, waardoor je dit resultaat krijgt.

Je gebruikt PKCS # 5 opvulling, die een aantal bytes (ten minste één) zal toevoegen, allemaal van dezelfde waarde als dit getal, dus de uiteindelijke lengte is een veelvoud van de bloklengte.

  • Voor uw 8-bytes-reeks moet u 8 bytes toevoegen, elk met de waarde 8. ASCII 8 is het backspace-teken, dat in uw terminal de cursor één naar links verplaatst (8 keer), wat resulteert in de < code> xxx overdrukt de abc .
  • Voor uw 7-bytes-reeks moet u 9 bytes toevoegen, elk met waarde 9. Dit is de horizontale tabulator, waardoor uw xxx behoorlijk aan de rechterkant verschijnt.

Zoek uit hoe je de juiste opvullingsmodus aan je ontsleutelingsfunctie moet leveren (het zou zo'n optie moeten hebben), of verwijder zelf de opvulling: Controleer de laatste byte van decrypt_string, converteer naar een getal (gebruik de ASCII-waarde) en neem dat veel bytes aan het einde van de decrypt_string . Je moet ook controleren of deze allemaal dezelfde waarde hebben. (U moet dit eerst doen voordat u de uitvoer interpreteert als een tekenreeks, d.w.z. een codering zoals UTF-8 of ASCII toepassen.)

1
toegevoegd