2017-10-06 10 views
0

私のプログラムはStenographyプログラムで、画像を別の画像に挿入して、カバー画像に挿入する前にデータを暗号化しようとしています。しかし、ほとんどの暗号化モジュールは文字列を必要とし、整数を渡そうとしています。整数を暗号化することはできますか?

文字列に変換して暗号化しようとしましたが、暗号化に特殊文字と文字が含まれているため、整数に変換することが不可能です。

私は何とか整数を暗号化できますか?それは非常に安全である必要はありません。

私はここに暗号化を追加しようとしています:

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) 

私はそれを追加しpixelnumbers1を暗号化しようとしてきた。しかしpixels[x, y]は、整数が必要です。あなたはコンピュータが任意のタイプのデータを参照する方法の基本的な誤解を持っている

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

ほとんどの暗号化システムは、任意のバイナリデータ、文字列、またはその両方で動作します。 「整数」は、整数のフォーマットがシステムによって大きく異なるため、処理できる概念ではありません。あなたはいつもあなたの整数を文字列に変換し、それを暗号化してから焼くことができます。暗号化されたデータは生のバイナリであることが多く、文字列化するにはBase64などでエンコーディングする必要があります。 – tadman

+0

整数、文字列などは、バイナリ値の解釈に過ぎません。 1つのタイプを暗号化できる場合は、それらをすべて実行できます。 –

+0

@tadman「焼く」とはどういう意味ですか? –

答えて

3

は、以下では、ケースのコードの残りの部分です。

文字列のように見えるファイルのバイトストリームを読み込みますが、実際には各文字は0〜255の値のバイトです。その一部は従来の文字列で表現されています。それらをすべて表示するにはprint(bytes(range(256))を試してください。ほとんどの標準暗号化関数は、バイト配列を取り込み、バイト配列を吐き出します。 「単純な」表現を持たないバイトが増えただけです。しかし、彼らは、あなたが最初に送られたものより任意の少ないバイトではありません

あなたdcimage.pyは以下があります。

#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 

この

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

をやってからあなたを停止するものはありません非常に重要:メッセージの最後にヌルバイトを追加すると、抽出シーケンスでいつ停止するかが分かります。文字列(またはバイト配列)を圧縮または暗号化すると、nullバイトがそのストリームの一部になる可能性が高く、抽出シーケンスが壊れてしまいます。その場合には、抽出するビット数を事前にプログラムに知らせるheaderを使用します。


ところで、バイトは既に整数形式です。

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

あなたはステガノグラフィのためbitwise operationsを使用する方がよいでしょう。あなたはバイトを取って、それらとピクセルとの間でビット演算を使うのではなく、両方をバイナリ文字列に変え、それらをスライスしてステッチし、整数に戻します。

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

私はそれを得たと思う、私はあなたが言ったことをした。 'fileData1 =オープン(秘密 'RB')。(読み) はEncryptedData = cipher_suite.encrypt(fileData1) はEncryptedData =ビン(intがbinascii.hexlify(はEncryptedData)、16)()' は、私が変換しましたその後、バイナリとは私のビット列にそれを追加しようとしたに 'BITSTRING = binName + nullDelimiter + binDataSize + nullDelimiter + encryptedData' しかし、私のgetPixelと機能でそれを保存しようとしたとき、私は得る:int型のため 無効なリテラル()ベース2: '0000000b' –

+0

私はまだPythonではまだまだ初心者ですので、私と一緒に裸にしてください。 –

+0

@PaulCabzおそらく整数からビット列への変換に間違いがあります。 'bin()'は '' 0b ''で始まる文字列を返し、何とか 'b'に乗ってタグ付けされた文字列を返します。トレースバックや関連するコード全体がどこに間違っているのかは分かりませんが、理解できない場合は新しい質問をする必要があります。これは最初に尋ねたことに関するものです。バイナリデータを暗号化する。 – Reti43

関連する問題