티스토리 뷰
AES128의 ECB, CBC, OFB로 256 * 256 pixel로 암호화를 진행하였습니다.
이제 해당 이미지들을 이용하여 딥러닝 학습을 진행해보도록 하겠습니다.
컴파일 : Google Colab
프레임워크 : tensorflow2
예상 결과 : ECB를 제외하고는 구분 불가
1. ECB와 CBC 구분
CBC와 OFB 자체는 육안으로 구분 불가하기에 먼저 ECB와 CBC 구분 모델부터 만들어보겠습니다.
제가 만든 모델의 경우, 처음에 AlexNet과 유사한 모델을 만들어 적용했지만, 55%의 정확도를 넘지 못해 kaggle의 개, 고양이 이미지 분류에 사용되는 모델을 참고하여 모델링하였습니다. 또한 256 * 256 pixel 보다 128 * 128 pixel에 더 적합한 모델링이라 판단되어, 암호화 이미지를 128 * 128 pixel로 변경하였습니다.
먼저 기본 모듈을 불러옵니다. 저는 구글 코랩에서 실행하였기에 코랩과 관련된 것 또한 설정하겠습니다.
from PIL import Image
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
from google.colab import drive
drive.mount('./gdrive', force_remount=True)
# pickle 파일 불러오기
import pickle
with open('./gdrive/My Drive/Images/pickles/ecb128.pickle', 'rb') as f:
ecb = pickle.load(f)
f.close()
with open('./gdrive/My Drive/Images/pickles/cbc128.pickle', 'rb') as f:
cbc = pickle.load(f)
f.close()
with open('./gdrive/My Drive/Images/pickles/ofb128.pickle', 'rb') as f:
ofb = pickle.load(f)
f.close()
pickle 파일은 해당 128 * 128 pixel 이미지(3채널)들을 dtype=uint8, array를 저장해놓은 것입니다.
정답레이블을 만들어 줍니다.
ecb_label = [0 for _ in range(1000)]
cbc_label = [1 for _ in range(1000)]
label = ecb_label + cbc_label
label = np.array(label)
# 0 : ECB, 1 : CBC
0을 ECB, 1을 CBC로 잡았습니다.
데이터를 합친 뒤 섞어줍니다.
import random
data = np.concatenate((ecb, cbc), axis=0)
tmp = [[x, y] for x, y in zip(data, label)]
random.shuffle(tmp)
X = [n[0] for n in tmp]
Y = [n[1] for n in tmp]
X = np.array(X)
Y = np.array(Y)
훈련용 데이터와 검증용 데이터로 분리합니다.
# 2000개 데이터 중 200개 검증용, 1800개 훈련용, 255로 나눠서 이미지화
x_valid, x_train = X[:200] / 255, X[200:] / 255
y_valid, y_train = Y[:200], Y[200:]
모델을 만들어줍니다.
1번째 층으로 filter 32개, kernel 3*3, 활성화 함수 relu, 패딩은 0패딩, 그 뒤 2*2 kernel을 이용해 MaxPolling을 진행하였습니다. 그리고 0.25 만큼 dropout 합니다.
2번째 층은 filter 64개, kernel 3*3, 활성화 함수 relu, 패딩은 0패딩, 그리고, 2*2 kernel을 이용해 MaxPolling,
0.25 만큼 dropout 합니다.
3번째 층은 filter 128개를 이용한 것외에 위와 동일합니다.
마지막으로 Flatten을 이용해 1차원으로 바꿔준 뒤 Dense 로 512개 노드를 만듭니다. (활성화 relu) 그리고 0.5만큼 dropout 진행 후, 최종적으로 ECB, CBC 둘 중 하나이므로 2개의 노드로 최종적으로 만듭니다. (출력 : softmax)
model = keras.models.Sequential([
keras.layers.Conv2D(32, 3, activation="relu", padding="same", input_shape=[128,128,3]),
keras.layers.MaxPooling2D(2, padding="valid"),
keras.layers.Dropout(0.25),
keras.layers.Conv2D(64, 3, activation="relu", padding="same"),
keras.layers.MaxPooling2D(2, padding="valid"),
keras.layers.Dropout(0.25),
keras.layers.Conv2D(128, 3, activation="relu", padding="same"),
keras.layers.MaxPooling2D(2, padding="valid"),
keras.layers.Dropout(0.25),
keras.layers.Flatten(),
keras.layers.Dense(512, activation="relu"),
keras.layers.Dropout(0.5),
keras.layers.Dense(2, activation="softmax")
])
결과가 잘 나왔습니다. 계산에 에러가 안 났으니 모델링의 틀은 오류가 없습니다.
이제 컴파일하면 다음과 같습니다.
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
history = model.fit(x_train, y_train, epochs=30, validation_data=(x_valid, y_valid))
잘 실행되었음을 알 수 있습니다. (최종 정확도 : 98%)
손실과 정확도를 그래프로 나타내면 다음과 같습니다.
검증데이터에도 잘 적용되었습니다.
역시 ECB는 잘 구분할 수 있습니다.
2. CBC와 OFB 구분
CBC와 OFB는 육안으로 구분이 거의 불가능합니다.
하지만 딥러닝 모델은 구분할지도 모르니 한 번 똑같은 모델을 이용해 돌려보았습니다. (코드는 위와 동일)
아쉽게도 50%의 정확도를 가지게 되었습니다.
이처럼 딥러닝을 통해 ECB의 취약성을 다시 한 번 깨닫게 되었습니다.
위의 코드와 pickle 파일 등은 github.com/hobin-jang/self_research_project 에 있습니다.
'암호학 > 자기주도연구 프로젝트' 카테고리의 다른 글
DES 이미지 암호화 딥러닝 학습 (16round) (0) | 2021.05.05 |
---|---|
이미지 암호화 / DES (single) 활용한 이미지 암호화 (0) | 2021.04.09 |
이미지 암호화 / AES 함수 만들어 사용 (0) | 2021.04.01 |
구글 이미지 크롤링 (0) | 2021.04.01 |
이미지 암호화 - python AES 라이브러리 사용 (9) | 2021.03.26 |