Ich versuche, mit PyCrypto zwei Funktionen zu erstellen, die zwei Parameter akzeptieren: die Nachricht und den Schlüssel, und dann die Nachricht zu verschlüsseln / entschlüsseln.
Ich habe im Internet mehrere Links gefunden, die mir helfen sollen, aber jeder hat Fehler:
Dieser bei codekoala verwendet os.urandom, was von PyCrypto nicht empfohlen wird.
Außerdem ist nicht garantiert, dass der Schlüssel, den ich der Funktion gebe, genau die erwartete Länge hat. Was kann ich tun, um dies zu erreichen?
Es gibt auch mehrere Modi, welcher wird empfohlen? Ich weiß nicht, was ich verwenden soll: /
Was genau ist die IV? Kann ich eine andere IV zum Ver- und Entschlüsseln bereitstellen, oder führt dies zu einem anderen Ergebnis?
Bearbeiten : Der Codeteil wurde entfernt, da er nicht sicher war.
/dev/urandom
auf UnixAntworten:
Hier ist meine Implementierung und arbeitet für mich mit einigen Korrekturen und verbessert die Ausrichtung des Schlüssels und der geheimen Phrase mit 32 Bytes und iv auf 16 Bytes:
quelle
Möglicherweise benötigen Sie die folgenden zwei Funktionen:
pad
-unpad
Auffüllen (beim Verschlüsseln) und - Aufheben des Auffüllens (beim Entschlüsseln), wenn die Länge der Eingabe kein Vielfaches von BLOCK_SIZE ist.Sie fragen also nach der Länge des Schlüssels? Sie können die md5sum des Schlüssels verwenden, anstatt sie direkt zu verwenden.
Nach meiner geringen Erfahrung mit PyCrypto wird die IV verwendet, um die Ausgabe einer Verschlüsselung zu verwechseln, wenn die Eingabe gleich ist. Daher wird die IV als zufällige Zeichenfolge ausgewählt und als Teil der Verschlüsselungsausgabe verwendet Verwenden Sie es, um die Nachricht zu entschlüsseln.
Und hier ist meine Implementierung, ich hoffe, sie wird für Sie nützlich sein:
quelle
pad
Funktion ist defekt (zumindest in Py3), ersetzen Sie sie durch,s[:-ord(s[len(s)-1:])]
damit sie versionübergreifend funktioniert .Lassen Sie mich Ihre Frage zu "Modi" beantworten. AES256 ist eine Art Blockchiffre . Als Eingabe werden ein 32-Byte- Schlüssel und eine 16-Byte-Zeichenfolge verwendet, die als Block bezeichnet werden, und es wird ein Block ausgegeben. Wir verwenden AES in einer Betriebsart, um zu verschlüsseln. Die obigen Lösungen schlagen die Verwendung von CBC vor, was ein Beispiel ist. Eine andere heißt CTR und ist etwas einfacher zu bedienen:
Dies wird oft als AES-CTR bezeichnet. Ich würde zur Vorsicht bei der Verwendung von AES-CBC mit PyCrypto raten . Der Grund dafür ist, dass Sie das Auffüllschema angeben müssen , wie in den anderen angegebenen Lösungen dargestellt. Wenn Sie beim Auffüllen nicht sehr vorsichtig sind , gibt es im Allgemeinen Angriffe , die die Verschlüsselung vollständig aufheben!
Nun ist es wichtig zu beachten, dass der Schlüssel eine zufällige 32-Byte-Zeichenfolge sein muss . Ein Passwort reicht nicht aus. Normalerweise wird der Schlüssel wie folgt generiert:
Ein Schlüssel kann auch aus einem Passwort abgeleitet werden :
Einige der oben genannten Lösungen schlagen vor, SHA256 zum Ableiten des Schlüssels zu verwenden. Dies wird jedoch im Allgemeinen als schlechte kryptografische Praxis angesehen . Weitere Informationen zu den Betriebsarten finden Sie in Wikipedia .
quelle
Für jemanden, der urlsafe_b64encode und urlsafe_b64decode verwenden möchte, ist hier die Version, die für mich funktioniert (nachdem ich einige Zeit mit dem Unicode-Problem verbracht habe).
quelle
Sie können eine Passphrase aus einem beliebigen Kennwort abrufen, indem Sie eine kryptografische Hash-Funktion ( NICHT Pythons integriert
hash
) wie SHA-1 oder SHA-256 verwenden. Python bietet Unterstützung für beide in seiner Standardbibliothek:Sie können einen kryptografischen Hashwert nur mit
[:16]
oder abschneiden,[:24]
und seine Sicherheit bleibt bis zu der von Ihnen angegebenen Länge erhalten.quelle
Dankbar für die anderen Antworten, die mich inspiriert haben, aber bei mir nicht funktioniert haben.
Nach stundenlang versucht , herauszufinden, wie es funktioniert, ich kam mit der Implementierung bis unten mit der neuesten PyCryptodomex Bibliothek (es ist ein andere Geschichte , wie ich es hinter Proxy einzurichten verwaltet werden , auf Windows, in einem virtualenv .. puh)
Arbeiten an Denken Sie bei Ihrer Implementierung daran, die Schritte zum Auffüllen, Codieren und Verschlüsseln aufzuschreiben (und umgekehrt). Sie müssen unter Berücksichtigung der Reihenfolge ein- und auspacken.
quelle
Zum Wohle anderer ist hier meine Entschlüsselungsimplementierung, die ich durch Kombinieren der Antworten von @Cyril und @Marcus erhalten habe. Dies setzt voraus, dass dies über eine HTTP-Anforderung mit dem angegebenen und Base64-codierten encryptedText eingeht.
quelle
Eine andere Einstellung dazu (stark abgeleitet von den obigen Lösungen) aber
getestet mit Python 2.7 und 3.6.5
quelle
Es ist etwas spät, aber ich denke, das wird sehr hilfreich sein. Niemand erwähnt ein Verwendungsschema wie das Auffüllen mit PKCS # 7. Sie können stattdessen die vorherigen Funktionen zum Auffüllen (beim Verschlüsseln) und Entpacken (beim Entschlüsseln) verwenden. I liefert den vollständigen Quellcode unten.
quelle
kompatible utf-8-Codierung
quelle
Ich habe beide
Crypto
undPyCryptodomex
Bibliothek benutzt und es ist blitzschnell ...quelle
quelle