원본사진이다.
이 비트맵 이미지를 각각 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 모드는 하나의 암호화 블럭이 다른 암호화 블럭에 영향을 주지 않아서 반복되는 값에 대한 동일한 출력이 발생하여 단순한 이미지일 경우에 위와 같이 어느정도 형태를 유추할 수 있게 된다.
하지만 ECB 모드와 달리 CBC 모드는 하나의 블럭이 다른 블럭에 영향을 주기 때문에 위와 같이 형태를 알 수 없게 된다.
'Cryptography' 카테고리의 다른 글
Dreamhack - Basic_Crypto1 (0) | 2022.10.19 |
---|---|
블록암호 기반 암호 라이브러리 구현 (2) | 2020.10.29 |
DES 구현 (C) (0) | 2020.09.02 |