Entschlüsseln einer Datei in einen Stream und Lesen des Streams in Pandas (hdf oder stata)

Überblick über das, was ich versuche zu tun. Ich habe verschlüsselte Versionen von Dateien, die ich in Pandas lesen muss. Aus ein paar Gründen ist es viel besser, in einen Stream zu entschlüsseln, anstatt eine Datei, also das ist mein Interesse unten, obwohl ich auch versuchen, eine Datei zu entschlüsseln, nur als Zwischenschritt (aber das funktioniert auch nicht).

Ich bin in der Lage, diese Arbeit für eine csv zu bekommen, aber nicht für entweder hdf oder stata (ich würde eine Antwort akzeptieren, die entweder für hdf oder stata funktioniert, obwohl die Antwort für beide gleich sein könnte, weshalb ich bin Kombiniert in einer frage).

Der Code zum Verschlüsseln / Entschlüsseln von Dateien wird aus einer anderen Stackoverflow-Frage entnommen (die ich momentan nicht finden kann).

import pandas as pd import io from Crypto import Random from Crypto.Cipher import AES def pad(s): return s + b"\0" * (AES.block_size - len(s) % AES.block_size) def encrypt(message, key, key_size=256): message = pad(message) iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CBC, iv) return iv + cipher.encrypt(message) def decrypt(ciphertext, key): iv = ciphertext[:AES.block_size] cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = cipher.decrypt(ciphertext[AES.block_size:]) return plaintext.rstrip(b"\0") def encrypt_file(file_name, key): with open(file_name, 'rb') as fo: plaintext = fo.read() enc = encrypt(plaintext, key) with open(file_name + ".enc", 'wb') as fo: fo.write(enc) def decrypt_file(file_name, key): with open(file_name, 'rb') as fo: ciphertext = fo.read() dec = decrypt(ciphertext, key) with open(file_name[:-4], 'wb') as fo: fo.write(dec) 

Und hier ist mein Versuch, den Code zu erweitern, um zu einem Stream zu entschlüsseln, anstatt eine Datei.

 def decrypt_stream(file_name, key): with open(file_name, 'rb') as fo: ciphertext = fo.read() dec = decrypt(ciphertext, key) cipherbyte = io.BytesIO() cipherbyte.write(dec) cipherbyte.seek(0) return cipherbyte 

Schließlich ist hier das Beispielprogramm mit Beispieldaten, die diese Arbeit machen wollen:

 key = 'this is an example key'[:16] df = pd.DataFrame({ 'x':[1,2], 'y':[3,4] }) df.to_csv('test.csv',index=False) df.to_hdf('test.h5','test',mode='w') df.to_stata('test.dta') encrypt_file('test.csv',key) encrypt_file('test.h5',key) encrypt_file('test.dta',key) decrypt_file('test.csv.enc',key) decrypt_file('test.h5.enc',key) decrypt_file('test.dta.enc',key) # csv works here but hdf and stata don't # I'm less interested in this part but include it for completeness df_from_file = pd.read_csv('test.csv') df_from_file = pd.read_hdf('test.h5','test') df_from_file = pd.read_stata('test.dta') # csv works here but hdf and stata don't # the hdf and stata lines below are what I really need to get working df_from_stream = pd.read_csv( decrypt_stream('test.csv.enc',key) ) df_from_stream = pd.read_hdf( decrypt_stream('test.h5.enc',key), 'test' ) df_from_stream = pd.read_stata( decrypt_stream('test.dta.enc',key) ) 

Leider glaube ich nicht, dass ich diesen Code mehr schrumpfe und noch ein komplettes Beispiel habe.

Auch hier wäre meine Hoffnung, alle 4 nicht funktionierenden Zeilen über die Arbeit zu haben (Datei und Stream für hdf und stata), aber ich bin glücklich, eine Antwort zu akzeptieren, die entweder für den hdf-Stream allein oder den Stata-Stream allein funktioniert.

Außerdem bin ich offen für andere Verschlüsselungsalternativen, ich habe gerade einen vorhandenen pycrypto-basierten Code benutzt, den ich hier auf SO gefunden habe. Meine Arbeit erfordert explizit 256-Bit-AES, aber darüber hinaus bin ich offen, so dass diese Lösung nicht speziell auf der pycrypto-Bibliothek oder dem spezifischen Code-Beispiel oben basieren muss.

Info zu meinem Setup:

 python: 3.4.3 pandas: 0.17.0 (anaconda 2.3.0 distribution) mac os: 10.11.3 

One Solution collect form web for “Entschlüsseln einer Datei in einen Stream und Lesen des Streams in Pandas (hdf oder stata)”

Das größte Problem ist die Padding / Unpadding-Methode. Es geht davon aus, dass der Nullzeichen nicht Teil des eigentlichen Inhalts sein kann. Da stata/hdf Dateien binär sind, ist es sicherer zu pad mit der Anzahl der zusätzlichen Bytes, die wir verwenden, als Zeichen codiert. Diese Nummer wird während des Ausbaus verwendet.

Auch für diese Zeit wird read_hdf nicht das Lesen aus einer Datei wie Objekt, auch wenn die API-Dokumentation behauptet. Wenn wir uns auf das stata Format beschränken, führt der folgende Code aus, was Sie brauchen:

 import pandas as pd import io from Crypto import Random from Crypto.Cipher import AES def pad(s): n = AES.block_size - len(s) % AES.block_size return s + n * chr(n) def unpad(s): return s[:-ord(s[-1])] def encrypt(message, key, key_size=256): message = pad(message) iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CBC, iv) return iv + cipher.encrypt(message) def decrypt(ciphertext, key): iv = ciphertext[:AES.block_size] cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = cipher.decrypt(ciphertext[AES.block_size:]) return unpad(plaintext) def encrypt_file(file_name, key): with open(file_name, 'rb') as fo: plaintext = fo.read() enc = encrypt(plaintext, key) with open(file_name + ".enc", 'wb') as fo: fo.write(enc) def decrypt_stream(file_name, key): with open(file_name, 'rb') as fo: ciphertext = fo.read() dec = decrypt(ciphertext, key) cipherbyte = io.BytesIO() cipherbyte.write(dec) cipherbyte.seek(0) return cipherbyte key = 'this is an example key'[:16] df = pd.DataFrame({ 'x': [1,2], 'y': [3,4] }) df.to_stata('test.dta') encrypt_file('test.dta', key) print pd.read_stata(decrypt_stream('test.dta.enc', key)) 

Ausgabe:

  index xy 0 0 1 3 1 1 2 4 

In Python 3 können Sie die folgenden pad , unpad Versionen verwenden:

 def pad(s): n = AES.block_size - len(s) % AES.block_size return s + bytearray([n] * n) def unpad(s): return s[:-s[-1]] 
  • Python gnupg.encrypt: keine Fehler, aber nicht verschlüsselnde Daten oder Dateien
  • Xlrd - Fehler "Arbeitsmappe ist verschlüsselt", Python 3.2.3
  • Python - GPG entschlüsselt funktioniert aber GNUPG nicht
  • Verschlüsseln und Entschlüsseln durch AES-Algorithmus in Python und Android
  • Entschlüsseln von Daten in Python, die in Java von Java verschlüsselt wurden
  • Wie kann ich einen String in Python verschlüsseln und entschlüsseln?
  • Entschlüsseln Sie SHA1 mit (Passwort) in Python
  • Ich muss sicher einen Benutzernamen und ein Passwort in Python speichern, was sind meine Optionen?
  • AES Entschlüsselung fehlschlägt beim Entschlüsseln eines zweiten Mal
  • Verschlüsseln von Daten in Python -
  • Verschlüsselte Datei oder db in python
  • Python ist die beste Programmiersprache der Welt.