티스토리 뷰

딥러닝을 활용한 암호 알고리즘 판별이라는 프로젝트를 본격적으로 시작하였습니다.

여러 데이터셋을 만들고 관련 내용을 공부하다 보니 느낀 점은 과연 이게 가능할까?입니다. ㅎㅎㅎ

(암호학도 어렵고 딥러닝도 어려워어어어)

 

 

 

간단하게 python의 pycrypto 모듈을 이용해 암호화를 진행해보겠습니다.

참고 : www.programmersought.com/article/55045025094/

 

우선 필요한 라이브러리와 모듈을 설치합니다. 그리고 암호화 시킬 파일의 경로를 가져옵니다.

(bmp : bitmap 파일, 이걸로 굳이 변환 안해도 됨. jpg로 해도 괜찮음.)

# 라이브러리로 이미지 암호화 해보기
from PIL import Image
from tensorflow import keras
import random
import string

# pycrypto 설치
pip install pycrypto

from Crypto.Cipher import AES
# colab에서 실험하였음. 파일 저장된 경로 지정
from google.colab import drive
drive.mount('/gdrive', force_remount=True)

filename = '/gdrive/My Drive/Images/linux_penguin.jpeg'
filename_encrypted_ecb = "file_encrypted_ecb"
filename_encrypted_cbc= "file_encrypted_cbc"
format = "bmp"

 

암호화에 필요한 함수들을 나열해보겠습니다.

 

1. 키 생성

def key_generator(size = 16, chars = string.ascii_lowercase):
    return ''.join(random.choice(chars) for _ in range(size))

키는 랜덤한 16byte 값으로 선정합니다. 이를 이용해 AES128 을 진행합니다.

 

2. 패딩

def pad(data):
    return data + b"\x00" * (16 - len(data) % 16)

AES는 블록 크기가 16byte이므로 데이터가 16배수 바이트가 되도록 0으로 패딩시킵니다.

 

3. RGB 형식으로 변환

데이터가 RGB 형식이 아닌 이미지 데이터도 존재합니다. (PNG 같은 것)

이를 RGB 형식으로 바꿔줍니다.

def trans_format_RGB(data):
    #tuple: Immutable, ensure that data is not lost
    red, green, blue = tuple(map(lambda e: [data[i] for i in range(0, len(data)) if i % 3 == e], [0, 1, 2]))
    pixels = tuple(zip(red, green, blue))
    return pixels

 

4. ECB 모드로 암호화 이미지 생성

암호화시킬 이미지 파일을 열어 RGB 형식으로 변환 후 aes_ecb_encrypt 함수를 이용해 암호화를 진행합니다.

(아래에 존재)

최종 암호화된 이미지를 bmp 파일로 저장합니다.

def encrypt_image_ecb(filename):
    #Open the bmp picture and convert it to RGB image
    im = Image.open(filename)
    #Convert image data into pixel value bytes
    value_vector = im.convert("RGB").tobytes()

    imlength = len(value_vector)
    #for i in range(original):
        #print(data[i])
    #Map the pixel value of the filled and encrypted data
    value_encrypt = trans_format_RGB(aes_ecb_encrypt(key, pad(value_vector))[:imlength])
    #for i in range(original):
        #print(new[i])

    #Create a new object, store the corresponding value
    im2 = Image.new(im.mode, im.size)
    im2.putdata(value_encrypt)

    # Save the object as an image in the corresponding format
    im2.save(filename_encrypted_ecb + "." + format, format)

 

5. CBC 모드로 암호화 이미지 생성

4번과 마찬가지 과정을 거치고, 모드만 다릅니다.

def encrypt_image_cbc(filename):
    #Open the bmp picture and convert it to RGB image
    im = Image.open(filename)
    value_vector = im.convert("RGB").tobytes()

    # Convert image data to pixel value bytes
    imlength = len(value_vector)

    # Perform pixel value mapping on the filled and encrypted data
    value_encrypt = trans_format_RGB(aes_cbc_encrypt(key, pad(value_vector))[:imlength])

    # Create a new object, store the corresponding value
    im2 = Image.new(im.mode, im.size)
    im2.putdata(value_encrypt)

    # Save the object as an image in the corresponding format
    im2.save(filename_encrypted_cbc + "." + format, format)

 

6. ECB 모드로 암호화

pycrypto 모듈을 이용해 AES를 호출하여 사용합니다. 

키와 모드, 이니셜 벡터를 설정해 새로운 데이터를 만들고, 해당 데이터를 encrypt 메서드로 암호화시키면 됩니다.

# ECB encryption
def aes_ecb_encrypt(key, data, mode=AES.MODE_ECB):
    #The default mode is ECB encryption
    aes = AES.new(key, mode)
    new_data = aes.encrypt(data)
    return new_data

 

7. CBC 모드로 암호화

6번과 마찬가지 과정을 거칩니다.

# CBC encryption
def aes_cbc_encrypt(key, data, mode=AES.MODE_CBC):
    #IV is a random value
    IV = key_generator(16)
    aes = AES.new(key, mode, IV)
    new_data = aes.encrypt(data)
    return new_data

결과를 확인해보겠습니다. (ECB 모드 암호화)

key = key_generator(16)
encrypt_image_ecb(filename)
Image.open('file_encrypted_ecb.bmp')
Image.open(filename)

원본 - 리눅스 펭귄
ECB 모드로 암호화

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함