스테가노그래피(Steganography)는 정보를 겉으로 드러나지 않게 숨기는 기술입니다. SHA1, MD5 같은 알고리즘을 통해 데이터를 암호화하는 암호학(Cryptography)과 달리, 스테가노그래피는 파일, 이미지, 메시지, 영상 등의 데이터를 다른 파일이나 이미지 안에 은밀하게 삽입하여 외부의 주의를 끌지 않도록 하는 데 초점을 맞춥니다.
이 글에서는 파이썬을 이용해 이미지의 외관에는 눈에 띄는 변화 없이 정보를 숨기는 간단한 프로그램을 만들어 보겠습니다. 프로그램은 크게 두 부분으로 구성됩니다.
- 디코딩(복호화) 함수 – 이미지 파일에서 숨겨진 비밀 정보를 추출합니다.
- 인코딩(부호화) 함수 – 비밀 메시지를 이미지에 삽입합니다.
여기서는 파이썬의 Pillow 라이브러리를 사용합니다(OpenCV 등 다른 라이브러리를 사용해도 무방합니다). pip로 간단히 설치할 수 있습니다.
$pip install pillow
픽셀과 색상 모델의 기본 개념
픽셀(Pixel)은 이미지를 구성하는 가장 작은 단위 요소입니다. 즉, 각 픽셀은 원본 이미지의 일부를 나타내며, 픽셀 수가 많을수록 실제 그림을 더 정밀하게 표현할 수 있습니다.
흑백 이미지(그레이스케일이 아닌 경우)에서는 검은색 픽셀이 1, 흰색 픽셀이 0의 값을 가집니다. 반면 컬러 이미지는 RGB(Red, Green, Blue)라는 세 가지 기본 색상 성분으로 구성되며, 각 성분은 0~255 범위의 값을 가집니다. 예를 들어 (255, 255, 255)는 흰색을, (0, 0, 0)은 검은색을 의미합니다. 8비트 이진수가 표현할 수 있는 최댓값이 255이므로, 이것이 표현 가능한 최대치입니다.
2진수를 10진수로 변환하기
2진수의 밑(base)은 2이므로, 10진수로 아주 쉽게 변환할 수 있습니다. 예를 들어 2진수 01010101의 10진수 값은 다음과 같습니다.
26 + 24 + 22 + 20 = 64 + 16 + 4 + 1 = 85
파이썬 터미널에서도 위 변환 결과를 직접 확인해 볼 수 있습니다.
>>> print(0b01010101) 85 >>> type(0b01010101) <class 'int'> >>> 0b01010101 85 >>> 0b01010110 86
구현 절차
전체적인 진행 과정은 다음과 같습니다.
1단계: 필요한 라이브러리/패키지를 임포트한다. 2단계: 파일 또는 이미지를 연다. 3단계: 원본 이미지에 텍스트를 인코딩한 후 저장한다. 4단계: 두 이미지(원본과 데이터가 숨겨진 이미지)를 비교하여 육안으로 식별 가능한 변화가 있는지 확인한다. 5단계: 이미지를 디코딩하여 숨겨진 데이터를 추출한다.
예제 코드
1. 라이브러리 임포트
>>> # 필요한 라이브러리 임포트 >>> from PIL import Image >>> import stepic
인코딩과 디코딩을 위해 stepic 라이브러리를 사용했습니다. 역시 pip로 설치할 수 있습니다.
$pip install stepic
2. 이미지에 메시지 인코딩하기
>>> # 데이터를 숨길 이미지 열기
>>> im = Image.open('TajMahal.png')
>>>
>>> # 이미지에 텍스트를 인코딩하고 다른 파일로 저장
>>> im1 = stepic.encode(im, b'Hello Python')
>>> im1.save('TajMahal_stego.png', 'PNG')
>>>
>>> # 두 이미지를 확인하여 눈에 띄는 변화가 있는지 살펴보기
>>> im1 = Image.open('TajMahal_stego.png')
>>> im1.show()실행해 보면 텍스트가 숨겨진 이미지와 원본 이미지의 외관 차이를 육안으로 구분하기 어렵다는 것을 알 수 있습니다.
3. 이미지에서 메시지 디코딩하기
>>> # 이미지를 디코딩하여 숨겨진 데이터 추출
>>> im2 = Image.open('TajMahal_stego.png')
>>> stegoImage = stepic.decode(im2)
>>> stegoImage
'Hello Python'디코딩 결과, 이미지에 숨겨두었던 'Hello Python'이라는 문자열이 그대로 추출되는 것을 확인할 수 있습니다.
마무리
이처럼 파이썬을 활용하면 몇 줄의 코드만으로 이미지 뒤에 텍스트를 손쉽게 숨길 수 있습니다. 동영상이나 JPEG 같은 다른 형식의 입력을 사용하거나, 다른 라이브러리를 활용해도 동일한 결과를 얻을 수 있습니다. 여러분도 파이썬으로 스테가노그래피의 세계를 직접 경험해 보시기 바랍니다.