2016-10-08 3 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) 

내 질문은, 배 두 가지입니다 1) 나는 기본적으로 진수의 텍스트 파일입니다 hexlify 전에 왜곡 된 암호화 된 파일()을 변환하는 방법에 대한 갈 것입니다 방법 문자열, 다시 이미지로? 출력을 모든 뷰어에서 jpg로 볼 수 있기를 바랍니다.그것을

필자가 원하는 것을 할 수 있는지를 파악할 수 없다는 점을 제외하고 필자는 몇 가지 시도를 해봤습니다.

감사합니다. 감사드립니다.

추신 : 나는 다른 암호에도 이것을 시도하고 싶습니다. 그래서 만약이 이해가 옳은지 아무도 명확히하는 데 도움이된다면 도움이 될 것이라고 생각합니다.

jpg -> 바이너리/16 진수로 변환 -> 암호화 -> 깨진 출력 -> bin/hex -> convert로 변환 jpg

2)는 위의 내용입니까? 16 진수 또는 빈으로 변환해야합니까?

+0

hexlify + encrypt를 되돌리려면 decrypt + unhexlify를 적용 하시겠습니까? – zvone

+0

@zvone 거기에 방법입니다 hexlify + 암호화 -> jpg로 변환? 명확하게 말하면, 왜곡 된 암호문을 이미지로 변환하는 방법이 있는지 알고 싶습니다. – baconSoda

+0

물론 방법이 있지만 문제가 무엇인지 아직 이해할 수 없습니다. 첫째, 왜 jpg를 16 진수로 변환하고 있습니까? 둘째, 16 진수를 원본으로 변환하는 것 외에는 모든 것이있는 것처럼 보입니다. 당신이 여기있다 : http://stackoverflow.com/q/9641440/389289 – zvone

답변

2

여기에서 질문은 암호화 된 이미지를 해독하지 않고 이미지로 표시하는 방법입니다.

암호화 된 내용은 이미지가 아니며 명확하게 이미지로 표현 될 수 없습니다. 수행 할 수있는 최선의 방법은 비트 맵으로 처리하는 것입니다. 즉, 각 이진 값은 일부 좌표에서 일부 색상의 강도를 나타냅니다. RGB RGB RGB ...

이미지는 2D이며, 암호화 된 데이터가 단지 바이트의리스트이다

이 화소 당 3 바이트로 데이터를 처리하는 논리 같다. 다시 몇 가지 옵션이 유효합니다. 정사각형 이미지 (NxN 픽셀)라고 가정 해 봅시다.

내가 PIL/Pillow을 사용하여 이미지를 만들려면 :

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,이 바이트의 절대적 문자열뿐 아니라 암호화 된 이미지를 수행 할 수 있습니다.

+0

이렇게하면이 문제를 해결하는 데 도움이됩니다. DES와 AES의 차이점을 확인했습니다. 카이저 암호를 말하는 것과 같은지 확인하고 싶습니다. 비트 맵이 모든 종류의 데이터를 배제하는지 여부. 감사합니다. – baconSoda