Verschlüsseln einer Datei mit RSA in Python

Ich verwende die Dateiverschlüsselung mit RSA, mit PyCrypto.

Ich weiß, es ist etwas falsch, vor allem weil RSA sehr langsam und zweitens ist, weil PyCrypto RSA nur 128 Zeichen verschlüsseln kann, also musst du die Datei in 128 Zeichen Chunks explodieren.

Dies ist der Code so weit:

from Crypto.PublicKey import RSA file_to_encrypt = open('my_file.ext', 'rb').read() pub_key = open('my_pub_key.pem', 'rb').read() o = RSA.importKey(pub_key) to_join = [] step = 0 while 1: # Read 128 characters at a time. s = file_to_encrypt[step*128:(step+1)*128] if not s: break # Encrypt with RSA and append the result to list. # RSA encryption returns a tuple containing 1 string, so i fetch the string. to_join.append(o.encrypt(s, 0)[0]) step += 1 # Join the results. # I hope the \r\r\r sequence won't appear in the encrypted result, # when i explode the string back for decryption. encrypted = '\r\r\r'.join(to_join) # Write the encrypted file. open('encrypted_file.ext', 'wb').write(encrypted) 

Also meine Frage ist: Gibt es bessere Methoden für die Verwendung von Private / Public Key Verschlüsselung ON FILES?

Ich habe von Mcrypt und OpenSSL gehört, aber ich weiß nicht, ob sie Dateien verschlüsseln können.

One Solution collect form web for “Verschlüsseln einer Datei mit RSA in Python”

Public-Key-Kryptographie wird in der Regel nur für kleine Datenmengen verwendet. Es ist langsam und kann schwer sein, richtig zu benutzen. Die übliche Praxis ist es, andere Methoden zu verwenden, um das asymmetrische Problem auf eine zu reduzieren, wo die Sicherheit von einem gemeinsamen Schlüssel bereitgestellt wird, dann verwenden Sie Public-Key-Kryptographie, um diesen gemeinsamen Schlüssel zu schützen. Beispielsweise:

  • Um eine Datei zu verschlüsseln, generiert zufällig einen geheimen Schlüssel für eine Block- oder Stream-Chiffre (zB AES). Speichern Sie die mit dieser Verschlüsselung verschlüsselten Daten und speichern Sie den geheimen Schlüssel, der mit dem öffentlichen Schlüssel verschlüsselt ist, neben der verschlüsselten Nutzlast.
  • Um eine Datei zu signieren, berechnen Sie einen kryptografischen Digest (zB SHA-256). Unterschreiben Sie den Digest der Datei mit dem privaten Schlüssel und speichern Sie das neben der Datei.

Also hier ist eine Skizze, wie die Verschlüsselung aussehen kann (Warnung, ungetesteter Code, direkt im Browser eingegeben):

 import os from Crypto.Cipher import AES from Crypto.PublicKey import RSA import Crypto.Util.number def encrypt_file(rsa, input, output): # Generate secret key secret_key = os.urandom(16) # Padding (see explanations below) plaintext_length = (Crypto.Util.number.size(rsa.n) - 2) / 8 padding = '\xff' + os.urandom(16) padding += '\0' * (plaintext_length - len(padding) - len(secret_key)) # Encrypt the secret key with RSA encrypted_secret_key = rsa.encrypt(padding + secret_key, None) # Write out the encrypted secret key, preceded by a length indication output.write(str(len(encrypted_secret_key)) + '\n') output.write(encrypted_secret_key) # Encrypt the file (see below regarding iv) iv = '\x00' * 16 aes_engine = AES.new(secret_key, AES.MODE_CBC, iv) output.write(aes_engine.encrypt(input.read())) 

Der iv ist ein Initialisierungsvektor für den CBC- Betriebsmodus . Es muss eindeutig pro Schlüssel pro Nachricht sein. Normalerweise wird es neben den Daten in Klartext geschickt. Hier, da der Schlüssel nur einmal benutzt wird, kannst du eine bekannte IV verwenden.

Die API der Blockchiffre ist in PEP 272 beschrieben . Leider unterstützt es nur all-at-once Verschlüsselung. Für große Dateien wäre es besser, Chunk von Chunk zu verschlüsseln; Sie können so wenig wie einen Block zu einem Zeitpunkt verschlüsseln (16 Bytes für AES), aber Sie brauchen eine bessere Kryptobibliothek dafür.

Beachten Sie, dass Sie im Allgemeinen nicht direkt mit RSA verschlüsseln sollten. Die offensichtlichste Sorge ist, dass der Angreifer den öffentlichen Schlüssel kennt und daher versuchen kann, den Klartext zu erraten (wenn der Angreifer den Klartext als swordfish , dann kann der Angreifer swordfish mit dem RSA-öffentlichen Schlüssel verschlüsseln und das Ergebnis mit dem Ausgang vergleichen Der RSA-Verschlüsselung). Eine weitere Sorge, die entstehen würde, wenn man die Datei an mehrere Empfänger senden möchte, ist, dass wenn der RSA-Verschlüsselungsschritt deterministisch ist, dann kann der Angreifer erkennen, dass die Ebenen gleich sind, weil die Ciphertexte gleich sind. Die normale Verteidigung gegen diese Probleme besteht darin, ein Polsterungsschema zu verwenden , das darin besteht, dem Klartext einige zufällige geheime Daten hinzuzufügen; Diese Daten werden als padding bezeichnet. Der Angreifer kann dann die zufälligen Daten nicht erraten und sieht für jede Verschlüsselung unterschiedliche Ergebnisse, weil derselbe Klartext niemals zweimal verschlüsselt wird; Soweit der legitime Empfänger betroffen ist, ist das Padding nur Daten, die weggeworfen werden können.

Hier kann es vorkommen, dass die oben genannten Bedenken in diesem Szenario nicht gelten. Allerdings gibt es andere Schwächen, die durch die Verwendung von RSA ungeschützt entstehen können. Besonders wenn der öffentliche Exponent sehr klein ist (hier nicht der Fall, da PyCrypto 65537 verwendet) oder Sie verschlüsseln dasselbe Material für viele verschiedene Empfänger (wieder wahrscheinlich nicht der Fall hier, da jede Nachricht einen eigenen geheimen Schlüssel hat), dann a Eine einfache mathematische Berechnung würde es dem Angreifer erlauben, den RSA-Klartext wiederherzustellen . Um diesen Angriff zu vermeiden, muss der Wert, der mit RSA verschlüsselt wird, "nah genug" zum RSA-Modul sein, so dass der Verschlüsselungsvorgang tatsächlich eine modulare Potenzierung durchführt. Die Polsterung, die ich vorschlage, sorgt dafür, dass durch die Herstellung der höchsten Ordnung Byte, die 0xff passt; Dies wird geglaubt, um sicher zu sein , obwohl in der realen Welt sollte man einen genehmigten Polsterungsmodus ( OAEP ) verwenden.

  • Wie kann ich in Python verschlüsseln und in Java entschlüsseln?
  • Entschlüsseln Sie eine AES-verschlüsselte Nachricht (verschlüsselt in Python) in Java
  • Häufigkeitsanalyse mit Tupelfehler
  • Entschlüsseln von Daten in Python, die in Java von Java verschlüsselt wurden
  • Einfache Möglichkeit, einen String nach einem Passwort zu codieren?
  • ASCII Vigenere Chiffre nicht entschlüsseln
  • Versuchen, RSA-Signatur mit Python aus C-Code zu erzeugen
  • Vigenere Chiffre - nicht korrekte Werte hinzufügen
  • Wie kann ich bcrypt / scrypt auf appengine für Python verwenden?
  • Ich muss sicher einen Benutzernamen und ein Passwort in Python speichern, was sind meine Optionen?
  • Obfuscate Strings in Python
  • Python ist die beste Programmiersprache der Welt.