자, 또 재밌는 시간이 돌아왔네요.
정보 은닉에 관해서 스테가노그라피라는게 있더군요.
방학전에 학교 도서관에서 영상처리 관련 책을 살펴보다가 발견했는데, 책을 빌리자니 반납할때 다시 학교를 와야 해서 안빌리고 대충 생각나는데로 구현해 보렵니다.

간단하게 말해서 스테가노그라피는 그림파일에 뭔가 장치를 통해 글이나 그림, 소리 등을 숨겨 놓는 것이라고 할 수 있습니다.
암호를 부호화와 복호화를 통해 생성하고 재조합하죠.


읽으실 분



서론은 이 정도로 하고요. 제가 구현하고자 하는 방법은 픽셀의 색상 특성을 이용하여 정보를 은닉할 비트를 가져오는 것입니다.
무슨 소리인고 하니, 하나의 픽셀은 RGB 3가지 빨간색, 녹색, 파란색의 요소로 되어 있으며 각각 8bit를 할당하여 하나의 픽셀에서는 총 24bit를 소모하게 돼있습니다. 16진수 표현으로는 000000에서 FFFFFF까지죠.

만일, 가로 세로 100픽셀인 그림에서 한 픽셀당 1bit의 공간을 가져온다면 총 100bit, 12.5byte를 확보할 수 있으며, 이는 영문자, 아스키 코드로 환산하면 6글자 정도를 담을 수 있는 공간이 됩니다. 이 공간이 커지면 긴 메세지나 음악 파일등도 담을 수 있습니다. 자, 그러면 그 공간은 그림에서 어떤식으로 확보를 할 것인가 궁금하실 텐데요. 알고나면 의외로 쉽습니다.

컴퓨터 기본 지식이 있으신 분들은 MSB나 LSB라는 것을 아실 겁니다. MSB는 Most Significant Bit의 약자로 우리말로 하자면 최대 유효 비트 또는 최상위 비트라고 할 수 있습니다. LSB는 Least Significant Bit의 약자로 최소 유효 비트 또는 최하위 비트라고 할 수 있습니다. MSB쪽에 가까워질 수록 그 존재가치는 높아지지만 LSB쪽으로 갈 수록 존재 가치를 상대적으로 떨어지게 됩니다. 쉬운 예를 하나 들어볼까요?

여러분이 복권에 당첨되어 12,345,678(천이백삼십사만 오천육백칠십팔)원에 당첨되었습니다. 정말 기분 좋겠죠? 근데, 옆의 친구가 어차피 공돈이니, 천원단위 이하로 5,678원을 달라고 귀찮게 구네요. 그럼 여러분은 어떻게 하시겠습니까? 저는 천이백만원이나 있으니, 그깟 만원도 안되는 돈이 대수냐며 친구에게 5,678원을 줄겁니다. 당첨액에 비하면 엄청 작은 돈이기 때문이죠. 즉, 돈은 앞자리로 갈 수록 가치가 높아집니다. 친구는 총 8자리의 금액 중 뒤의 4자리에 해당하는 돈을 달라고 했습니다. 매우 작은 돈이죠. 근데 친구가 미쳐서 앞의 4자리에 해당하는 12,340,000원을 달라고 했으면 과연 줬을까요? 아니겠죠. 절대 안줍니다. 왜 줍니까? 이 경우를 MSB와 LSB에 적용시켜보죠.

12
3
4
5
6
7
8
천만백만십만
MSB      LSB
 <상승<--<--
절대적
가치
-->-->
 하락>

천만단위로 갈 수록 가치는 상승하며 중요합니다. 하지만, 일단위로 가면 가치는 하락하며 그냥 친구에게 줘도 되는 돈이 됩니다. 친구에게 주건 말건 나는 천이백삼십여만원을 가지고 있으니까요. 이건 어머니의 심부름을 마치고 거스름돈이 1,150원 남았을때 150원을 슬쩍하는 것과 같습니다. -_- 어머니는 그래 푼돈이니 니가 알아서 심부름값해라 라고 하실겁니다. 하지만, 천원을 갖고 150원을 드리면... -_-

그림파일에서도 마찬가지로 각 픽셀에서 최하위 비트를 기준으로 몇개의 비트는 우리가 가져가더라도 시스템은 별 상관하지 않습니다. 정확히 말하자면, 우리의 눈이 별 상관을 안합니다. 몇개의 비트를 가져가는건 시스템이 가져가지 말라도 우리는 뺐어 올 수 있으니까요. -_- 근데, 우리의 눈은 뭔 비트를 가져가서 지지고 볶든 모른다는 겁니다. 좀더 정확히 말하자면, 그림파일에서 몇개의 비트를 조작해도 그림파일이 전혀 변한것 같지 않게 느끼다는 것이죠. 우리의 눈이 말입니다. 분명 조작전과 조작후의 그림파일은 다릅니다. 분명 우리가 뭔가 비트를 조작했다고요. 근데, 우리눈은 그걸 몰라요. 신기하지 않습니까?


자, 그럼 도대체 뭘 어떻게 어디서 비트를 가져오느냐가 문제인데요. 한 픽셀에서 RGB 각각 3비트씩 총 9비트를 뽑아올 수 있습니다. 즉, 위에 말한 LSB부터 3비트를 뽑아오는 것이죠.
예를 들어 어떤 픽셀이 완전한 흰색이라고 해봅시다. 그럼, RGB각각 255의 값을 가지며, 각각의 비트는 모두 1로 채워집니다. 바로 아래처럼요.

 MSB
      LSB
R1
1
111
1
1
1
G1
11
1
1
1
1
1
B1
1
1
1
1
1
1
1

여기서 LSB에 가까운 총 9개의 비트를 우리가 쓰는겁니다. 자, 그러면 다시 예를 들어서 이 9비트의 공간에 공교롭게도 모두 0이 들어가는 대참사(?)가 발생했다고 해봅시다. 아래처럼요.

 MSB
      LSB
R1
1
111
0
0
0
G1
11
1
1
0
0
0
B1
1
1
1
1
0
0
0

그렇다고 하더라도 원래 픽셀의 색상인 흰색에서 약간, 아주아주아주 약간 정확히 수치로 말하자면 7정도의 색상차이가 발생합니다.
처음 상태가 RGB=(255, 255, 255)였다면, 두번째 상태는 RGB=(248, 248, 248)이 되는 것이죠. 백분율로 따지면 약 2.75% 정도의 손실이 발생합니다. 10,000원에서 280원 빠졌다고 생각해보세요. 게다가 우리눈은 우리가 생각하는 것 보다더 둔합니다. 9개의 비트를 전혀다른 것으로 바꾸더라도 우리의 눈은 그 색이 여전히 처음과 같은 흰색이라고 느끼게 되는 것이죠. 이제 슬슬 감이 오시는지요. 이제, 9개의 비트에 어떤 짓(?)을 하셔도 됩니다. 다만, 거꾸로 그 정보를 여러분이 알 수 있도록 하면 되죠.

자, 그럼 잠깐 쉬고, 다음편에서 찾아뵙죠.
  1. 김군 2008/12/28 20:36 답글수정삭제

    서론을 읽고 조용히 백스페이스를 누지른다[...]

트랙백 주소 :: http://blog.kimchulho.com/246/trackback/
옵션
댓글 달기