Cryptography

BMP Image 암호화(ECB, CBC mode)

Lucvs 2020. 10. 16. 23:24

원본사진이다.

이 비트맵 이미지를 각각 ECB 모드와 CBC 모드로 암호화하였을 때 어떻게 변화하는지 살펴보자.

다음과 같은 코드로 암호화를 수행한다.

from Crypto.Cipher import AES from PIL import Image import binascii, os, random, struct def convert2RGB(data): r, g, b = tuple(map(lambda d: [data[i] for i in range(0, len(data)) if i % 3 == d], [0, 1, 2])) pixels = tuple(zip(r, g, b)) return pixels def encrypt_bmp_file(key, mode, iv, in_filename, out_filename = "Enc.bmp"): # Get RGB data from BMP file im = Image.open(in_filename) data = im.convert("RGB").tobytes() original = len(data) # PKCS7 Padding pad_len = 16 - len(data) % 16 pad = pad_len.to_bytes(1, byteorder = 'big', signed = False) * pad_len #PKCS7 data += pad # Encryption - AES encryptor = AES.new(key, mode, iv) encrypted = convert2RGB(encryptor.encrypt(data)[:original]) #convert to RGB # Create a new PIL Image object and # save the old image data into the new image im2 = Image.new(im.mode, im.size) im2.putdata(encrypted) # Save Image im2.save(out_filename) print("{} is encrypted.".format(in_filename)) key = bytes.fromhex("add000334a52d6da376e7a3d4a1daef0") iv = bytes.fromhex("add000334a52d6da376e7a3d4a1daef0") for j in range(0, 2): mode = AES.MODE_ECB str1 = "apple.bmp".format(j) str2 = str1 + ".ECB.bmp" str3 = str2 + ".bmp" encrypt_bmp_file(key, mode, iv, str1, out_filename = str2) mode = AES.MODE_CBC str2 = str1 + ".CBC.bmp" str3 = str2 + ".bmp" encrypt_bmp_file(key, mode, iv, str1, out_filename = str2) #Source #"apple.bmp" - https://www.google.co.kr/url?sa=i&url=https%3A%2F%2Fwww.youtube.com%2Fchannel%2FUCdHwip-Xqhp-nZIywpI67sw&psig=AOvVaw07alTZ52agZOOzmcjQ12SS&ust=1602761397528000&source=images&cd=vfe&ved=0CAkQjhxqFwoTCNj_ytP9s-wCFQAAAAAdAAAAABAD


암호화한 결과는 다음과 같다.

ECB mode
CBC mode

 

ECB 모드는 하나의 암호화 블럭이 다른 암호화 블럭에 영향을 주지 않아서 반복되는 값에 대한 동일한 출력이 발생하여 단순한 이미지일 경우에 위와 같이 어느정도 형태를 유추할 수 있게 된다.

하지만 ECB 모드와 달리 CBC 모드는 하나의 블럭이 다른 블럭에 영향을 주기 때문에 위와 같이 형태를 알 수 없게 된다.