2017-10-06 6 views
0

Also mein Programm ist ein Stenographie-Programm, es fügt ein Bild in ein anderes Bild, und ich versuche, die Daten vor dem Einfügen in das Titelbild zu verschlüsseln. Die meisten Verschlüsselungsmodule erwarten jedoch Zeichenfolgen, und ich versuche, ganze Zahlen zu übergeben.Ist es möglich ganze Zahlen zu verschlüsseln?

Ich habe versucht, zu String zu konvertieren und dann zu verschlüsseln, aber die Verschlüsselung ist voll von Sonderzeichen und Buchstaben, so dass die Konvertierung zurück in Integer zum Einfügen unmöglich ist.

Wer weiß, ob ich irgendwie eine ganze Zahl verschlüsseln kann? Es muss nicht sehr sicher sein.

Ich versuche, die Verschlüsselung hier hinzuzufügen:

for i in range(0,3): 
    #verify we have reached the end of our hidden file 
    if count >= len(Stringbits): 
     #convert the bits to their rgb value and appened them 
     for rgbValue in pixelList: 
      pixelnumbers1 = int(''.join(str(b) for b in rgbValue), 2) 
      #print pixelnumbers1 
      rgb_Array.append(pixelnumbers1) 
     pixels[x, y] = (rgb_Array[0], rgb_Array[1], rgb_Array[2]) 
     print "Completed" 
     return imageObject.save(output) 

Ich habe versucht, pixelnumbers1

zu verschlüsseln dann in hinzufügen Aber pixels[x, y] erfordert eine ganze Zahl..

Unten ist der Rest des Codes in-Fall:

def write(mainimage, secret, output): 
    #string contains the header, data and length in binary 
    Stringbits = dcimage.createString(secret) 
    imageObject = Image.open(mainimage).convert('RGB') 
    imageWidth, imageHeight = imageObject.size 
    pixels = imageObject.load() 
    rgbDecimal_Array = [] 
    rgb_Array = [] 
    count = 0 

    #loop through each pixel 
    for x in range (imageWidth): 
     for y in range (imageHeight): 
      r,g,b = pixels[x,y] 
      #convert each pixel into an 8 bit representation 
      redPixel = list(bin(r)[2:].zfill(8)) 
      greenPixel = list(bin(g)[2:].zfill(8)) 
      bluePixel = list(bin(b)[2:].zfill(8)) 
      pixelList = [redPixel, greenPixel, bluePixel] 

      #for each of rgb 
      for i in range(0,3): 
       #verify we have reached the end of our hidden file 
       if count >= len(Stringbits): 
        #convert the bits to their rgb value and appened them 
        for rgbValue in pixelList: 
         pixelnumbers1 = int(''.join(str(b) for b in rgbValue), 2) 
         #print pixelnumbers1 
         rgb_Array.append(pixelnumbers1) 
        pixels[x, y] = (rgb_Array[0], rgb_Array[1], rgb_Array[2]) 
        print "Completed" 
        return imageObject.save(output) 

       #If we haven't rached the end of the file, store a bit 
       else: 
        pixelList[i][7] = Stringbits[count] 
        count+=1 
      pixels[x, y] = dcimage.getPixel(pixelList) 
+2

Die meisten Verschlüsselungssysteme arbeiten mit beliebigen binären Daten, Strings oder beidem. "Integer" ist kein Konzept, das sie verarbeiten können, da das Format für Ganzzahlen von System zu System stark variiert. Sie können Ihre Ganzzahlen immer in Strings konvertieren, verschlüsseln und dann einbinden. Verschlüsselte Daten sind oft rohe Binärdateien, und für die Strings ist eine Codierung mit Base64 oder ähnlichem erforderlich. – tadman

+0

Ganzzahlen, Zeichenfolgen usw. sind nur Interpretationen von Binärwerten. Wenn Sie einen Typ verschlüsseln können, können Sie alle tun. –

+0

@tadman was meinst du mit "backen es in"? –

Antwort

3

Sie haben ein grundlegendes Missverständnis, wie Computer, jede Art von Daten zu sehen.

Sie lesen den Bytestrom einer Datei, die für Sie wie eine Zeichenfolge aussieht, aber jedes Zeichen ist eigentlich ein Byte, ein Wert von 0 bis 255. Es kommt einfach vor, dass einige von ihnen durch herkömmliche Zeichenfolgen dargestellt werden. Versuchen Sie print(bytes(range(256)), um alle zu sehen. Die meisten Standard-Verschlüsselungsfunktionen verwenden ein Byte-Array und spucken ein Byte-Array aus. Es passiert einfach, dass Sie mehr Bytes bekommen, die keine "einfache" Darstellung haben. Aber sie sind nicht weniger Bytes als das, was Sie ursprünglich eingespeist

Ihre dcimage.py hat folgendes:.

#get the file data in binary 
fileData = bytearray(open(secret, 'rb').read())#opens the binary file in read or write mode 
for bits in fileData: 
    binDataString += bin(bits)[2:].zfill(8)#convert the file data to binary 

Es gibt nichts, was man aufhört zu tun, um dieses

fileData = open(secret, 'rb').read() # a bytes object by default 
encryptedData = myEncryptionFuction(fileData) # also a bytes object 
for bits in encryptedData: 
    # ... 

SEHR WICHTIG: Sie fügen ein Nullbyte am Ende Ihrer Nachricht hinzu, damit Ihre Extrahiersequenz weiß, wann sie zu stoppen ist. Wenn Sie eine Zeichenfolge (oder ein Bytearray) komprimieren oder verschlüsseln, ist es wahrscheinlich, dass ein Nullbyte Teil dieses Streams ist, wodurch die Extraktionssequenz unterbrochen wird. In diesem Fall möchten Sie eine header verwenden, die Ihrem Programm im Voraus sagt, wie viele Bits extrahiert werden sollen.


Übrigens sind Bytes bereits in ganzzahliger Form.

>>> some_byte = b'G' 
>>> some_byte[0] 
71 

Du bist besser von bitwise operations für Steganographie verwenden. Sie nehmen Bytes und anstatt bitweise Operationen zwischen ihnen und Ihren Pixeln zu verwenden, wenden Sie beide auf binäre Zeichenketten an, schneiden Sie und stechen Sie sie und dann drehen Sie sie zurück zu ganzen Zahlen.

def bytes_to_bits(stream): 
    for byte in stream: 
     for shift in range(7, -1, -1): 
      yield (byte >> shift) & 0x01 

secret_bits = tuple(bytes_to_bits(encoded_data)) 

# simplified for one colour plane 
for x in range(image_height): 
    for y in range(image_width): 
     # (pixel AND 254) OR bit - the first part zeroes out the lsb 
     pixels[x,y] = (pixels[x,y] & 0xfe) | secret_bits[count] 
     count += 1 

# ------------------------------------- 

# to extract the bit from a stego pixel 
bit = pixel & 0x01 
+0

Ich glaube, ich habe es verstanden, ich habe getan, was du gesagt hast. 'fileData1 = open (Geheimnis, 'rb'). Read() EncryptedData = cipher_suite.encrypt (fileData1) EncryptedData = bin (int (binascii.hexlify (EncryptedData), 16))' I umgewandelt binär und dann versuchte, es in meine bitstring hinzufügen 'bitstring = binName + nullDelimiter + binDataSize + nullDelimiter + encryptedData' Aber wenn es in meiner getPixel Funktion zu speichern versuchen, erhalte ich ein: ungültig wörtliche für int() mit Base 2: '0000000b' –

+0

bin ich relativ noch immer ein Anfänger mit Python, also bitte bare mit mir. –

+0

@PaulCabz Sie haben wahrscheinlich einen Fehler bei der Umwandlung von Ganzzahl in Bitfolge. 'bin()' gibt dir einen String, der mit '' 0b '' beginnt und irgendwie wird 'b' für die Fahrt angehängt. Es ist unmöglich zu sagen, wo Sie mit dem gesamten Traceback und dem relevanten Code schief gelaufen sind, aber wenn Sie es nicht herausfinden können, sollten Sie eine neue Frage stellen. Hier geht es um das, was Sie ursprünglich gefragt haben; Binärdaten verschlüsseln. – Reti43

Verwandte Themen