2016-10-08 5 views
0
#encrypting an image using AES 
import binascii 
from Crypto.Cipher import AES 


def pad(s): 
    return s + b"\0" * (AES.block_size - len(s) % AES.block_size) 

filename = 'path to input_image.jpg' 
with open(filename, 'rb') as f: 
    content = f.read() 

#converting the jpg to hex, trimming whitespaces and padding. 
content = binascii.hexlify(content) 
binascii.a2b_hex(content.replace(' ', '')) 
content = pad(content) 

#16 byte key and IV 
#thank you stackoverflow.com 
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') 
ciphertext = obj.encrypt(content) 

#is it right to try and convert the garbled text to hex? 
ciphertext = binascii.hexlify(ciphertext) 
print ciphertext 

#decryption 

obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') 
plaintext = obj2.decrypt(ciphertext) 
#content = content.encode('utf-8') 
print plaintext 
#the plaintext here matches the original hex input file as it should 


with open('path to - AESimageDecrypted.txt', 'wb') as g: 
    g.write(plaintext) 

Meine Frage ist zweifach, 1), wie würde ich mich über die verschlüsselte Datei konvertieren (die vor hexlify verstümmelt), die im Grunde eine Textdatei von hex Saiten, zurück in ein Bild? Ich möchte, dass die Ausgabe als JPG auf jedem Viewer angezeigt werden kann.wie als Bild verschlüsseltes Bild anzuzeigen, ohne zu Entschlüsseln

Ich habe ein paar Dinge ausprobiert, stieß auf Kissen, außer ich kann nicht zu begreifen scheinen, wenn es tun kann, was ich will.

Jede Hilfe wäre dankbar, danke.

PS: Ich möchte dies auch mit anderen Chiffren versuchen. Also ich denke, es wäre hilfreich, wenn jemand helfen kann, wenn dieses Verständnis richtig ist:

jpg -> in binäre/hex konvertieren -> verschlüsseln -> verzerrte Ausgabe -> in bin/hex konvertieren -> konvertieren zu jpg

2) ist das obige möglich? und sollten sie in hex oder bin umgewandelt werden?

+0

Um hexlify + encrypt zurückzusetzen, wenden Sie entschlüsseln + unhexlify? – zvone

+0

@zvone gibt es einen Weg zu hexlify + encrypt -> in jpg konvertieren? Um klarer zu sein, würde ich gerne wissen, ob es einen Weg gibt, den verschlüsselten Chiffretext zu nehmen und diesen in ein Bild umzuwandeln? – baconSoda

+0

Natürlich gibt es einen Weg, aber ich verstehe immer noch nicht, was das Problem ist. Erstens, warum konvertierst du das jpg überhaupt in hex? Zweitens sieht es so aus, als ob Sie alles außer dem Konvertieren von Hex in das Original haben. Sie haben das hier: http://Stackoverflow.com/q/9641440/389289 – zvone

Antwort

2

Die Frage ist hier, wie man ein verschlüsseltes Bild als Bild anzeigen kann, ohne es zu entschlüsseln.

Der verschlüsselte Inhalt ist kein Bild und kann nicht eindeutig als Bild dargestellt werden. Das Beste, was gemacht werden kann, ist, es als eine Bitmap zu behandeln, d. H. Jeder Binärwert repräsentiert die Intensität einer Farbe an einer Koordinate.

Es erscheint logisch, die Daten als 3 Bytes pro Pixel zu behandeln: RGB RGB RGB ...

Bilder sind 2D und verschlüsselte Daten sind nur eine Liste von Bytes. Auch hier gelten mehrere Optionen. Nehmen wir an, es ist ein quadratisches Bild (NxN Pixel).

das Bild zu erstellen, ich PIL/Pillow verwenden würde:

from PIL import Image 

# calculate sizes 
num_bytes = len(cyphertext) 
num_pixels = int((num_bytes+2)/3)      # 3 bytes per pixel 
W = H = int(math.ceil(num_pixels ** 0.5))    # W=H, such that everything fits in 

# fill the image with zeros, because probably len(imagedata) < needed W*H*3 
imagedata = cyphertext + '\0' * (W*H*3 - len(cyphertext)) 

image = Image.fromstring('RGB', (W, H), imagedata)   # create image 
image.save('C:\\Temp\\image.bmp')       # save to a file 

BTW, kann dies eine beliebige Zeichenfolge von Bytes mit absolut getan werden, nicht nur verschlüsselten Bildern.

+0

dies half, das Problem zu lösen. Ich habe die Unterschiede zwischen DES und AES untersucht. Ich möchte prüfen, ob es gleich ist mit einer Caeser-Chiffre. Ob die Bitmaps irgendeine Art von Daten verraten. Danke eine Tonne zvone. – baconSoda

Verwandte Themen