original.png 와 encrtpted.png가 있다. 두 그림을 비교하기 위해서는
compare을 사용할것이다. 이를 위해서 imagemagic이 있어야 한다.
오리지널 png
암호화 png
결과값이다.
다른 부분의 범위를 구하면, x의 범위는 0~48 y의 범위는 0~6이다.
x와 y의 범위를 구하는 방식은 다음과 같은 파이썬 코드를 통해서이다.
from PIL import Image
img = Image.open("../../Desktop/original.png")
img1 = Image.open("../../Desktop/encrypted.png")
data = img.load()
data1 = img1.load()
red = (255, 0, 0)
text = ""
binary_lines = []
width, height = img.size
for x in range(height):
for y in range(width):
pixel = data[y,x]
pixel1 = data1[y,x]
if pixel != pixel1:
print(x,y)
결과 값을 통해서 범위는 유추가 가능하다.
이에
from PIL import Image
img1 = Image.open("original.png")
img2 = Image.open("encrypted.png")
str = ''
for x in range(49):
data = ''
for y in range(7):
p_img1 = img1.getpixel((x, y))
p_img2 = img2.getpixel((x, y))
if p_img1 == p_img2:
data += '0'
else:
data += '1'
str += chr(int(data,2))
print(str)
다음과 같은 코드를 짜서 한줄당 한개의 글자를 가져온다
참고로 int(,2)는 정수을 2진수로 보라는 뜻이다. chr은 아스키코드 변환 함수이다.
위 파이썬 결과는 The flag is SHA256{d1ff1cul7_t0_f0cu5,wa5n't_i7?}이다
이에 d1ff1cul7_t0_f0cu5,wa5n't_i7?를 SHA256로 해쉬값을 구하면 다음과 같다.
하지만 정답은 BDFA42FD05BFA808E9BCB63786ED3983353AC7F6874C37046722AB5944C79F0D 이다. 이유를 찾아보니 sha256은 대문자와 소문자를 구별하지 않는다 결국 대문자로 입력하면 정답으로 처리한다..
정답: BDFA42FD05BFA808E9BCB63786ED3983353AC7F6874C37046722AB5944C79F0D
출제 이유 : 이미지 비교 연습. 궁금한점은 왜 깔끔하게 한줄당 8비트가 아닌 7비트를 입력했는지이다.