Clolent

XOR연산

어떠한 공부를 할때에는 정의부터 정확히 짚고 가는것이 좋다고 생각함으로...


XOR 연산 이란 : 배타적 논리합 이라고도 하며 밑에 있는 기호를 사용하고 코딩상에서는 ^ 를 사용한다. 제곱?

두 명제 중에 정확히 하나만 참일 경우 참 값을 돌려주는 연산


 XOR 연산

입력값 

결과값 

0 , 0 

0 , 1 

1 , 0 

1 , 1 


OS 를 공부할때 XOR 로 사라진 파일에 대한 백업처리를 했던 것이 기억이 난다.


XOR을 두번 한다면 원래 자기자신이 되거 OR 나 AND 연산에 비해 그 패턴이 독특하기때문에, 암호화에도 많이 쓰인다고 한다. 고급 암호화 표준에서 MixColumns 라는 단계에서 XOR 을 특별하게 사용하고 AddRoundKey 에서도 XOR을 쓴다고 하지만...이해하기 어려우므로 패스...


XOR 이 가지는 가장 특이한 성질은 바로 반전 시켜줄수 있다는 것이다. 위의 입력값과 결과값을 보라, 생각을 해보자, 0일때 1을 만나면 1이 되고, 0일때 0 을 만나면 그대로 0이다.

1일땐 1을 만나면 0이되고 0을 만나면 1이된다.


1이 1만나면 0 / 0이 1만나면 1 그렇다 

어떠한 비트가 있을 때, 1111 1111 과 XOR 연산을 시키면 원래의 비트의 0과 1이 반전되어 

나타난다. 실제로 그러한지 몇번 해보자


입력값

0011 1010

1001 0110 

XOR 

1111 1111

1111 1111 

결과값 

 1100 0101 

0110 1001 

 

0과 1이 반전되어 나왔다. 


그리고 다시한번 이를 XOR 연산을 한다면 

        

 입력값

1100 0101 

0110 1001 

XOR 

1111 1111 

1111 1111 

결과값 

0011 1010 

1001 0110 


같은 대상에 대해서 같은 XOR 을 두번했더니 자기 자신이 나왔다. 이제 실제 숫자를 가지고 한번 생각을 해보자.


65 라는 숫자를 비트로 나타내보면 0100 0001 이고

42 라는 숫자를 비트로 나타내보면 0010 1010 이다. 자 이제 이 두 수를 XOR 해보자

65

0100 0001

 42 

 0010 1010 

결과 [ 107 ] 

 0110 1011 

65와 42를 XOR 연산 했더니 107이 나왔다.

자 그럼 이제 이 107을 다시 42와 XOR 연산을 해보자


107 

0110 1011 

42 

0010 1010 

결과 [ 65 ] 

0110 0001 


원래데로 65가 나왔다. 놀랍다


그런데 이를 보고있으면 한가지 특성을 더 알수있다. 결과값이 107이나 65만을 보고서는

앞에 XOR 연산된 두비트중 앞에 것이 True 인지 뒤에것이 True 인지 알수가 없다는 것이다.


XOR 연산 결과가 1 이면 이는 ( 0 , 1 ) 일수도 ( 1 , 0 ) 일수도 있다는 것이다 ! 


그럼 이제 이러한 XOR 을 가지고 어떻게 암호화를 하는지 알아보자


---------------------------------------------------------------------


우선 XOR 은 CPU 에서 제공하는 연산으로 128비트를 암/복호화 하는데 만여 사이클이 소요되는 AES 암/복호화와 달리 많아야 100사이클정도면 128비트를 암호화 할수 있다고 한다.

한마디로 굉장히 빠르다는 것 ! 


일단 가장 기본적인 암호화를 생각해보자 우리가 임의의 KEY 를 만들고 우리가 가진 데이터를 이 KEY 로 XOR 연산을 해서 저장하거나 전송하는것이다. 다른 사이트에서 친절하게 연습해놓은 코드를 살포시 가져와서 보자.

http://www.gamedevforever.com/165 이곳 출처


47a3efc2 라는 KEY 를 가지고 XOR 연산을 한것으로 결과값을 보면 도저히 알아볼수가 없다.

와 암호화 성공! 이라고 하고싶지만, 의외로 XOR 만을 이용해서는 힘들다고한다.

만약 AAAAA 이렇게 보내면 ? 어떠한 값이 나올것이고 BBBBB 로 다시보내고 이런식으로 보내서 바뀌는 패턴을 보고 하다보면 KEY를 들키는 것은 시간문제라고 한다.

왜냐하면 앞에서도 봤듯이, XOR 에는 '복원' 시켜주는 성질이 있기 때문이다.

A,B,C 라는 것이있을때 A ^ B = C 가 성립하는것을 알고있고, A,B,C 중 두개를 알면 나머지 하나를 알아낼 수 있기 때문이라고한다.


즉 XOR 만을 이용한 어떠한 암호화 과정을 거친다한들 AAA, BBB, CCC 등을 보내면서 몇 비트 

단위로 반복되는지 확인하고, 바뀌어서 나온 값을 원래 입력한 값과 비교해나가다 보면 내가 숨긴 KEY 를 찾을 수있다는것.


결론 : XOR 만을 가지고서는 어느정도의 보안성을 갖출순 있지만, 어렵지않게 뚫릴수 있다. 



돌아다니다 보니 흥미로운 그림을 찾을수 있었다.

이런 그림이 있는데 이 그림을 AND 연산을 해서 하면 어떻게 될까 ? 


AND 연산의 결과다. 뭔가 뿌옇게 됬다고 해야할까, 바뀌었다. 그럼 OR 연산을 하면 어떻게 될까.



선명하다, 나름 마지막으로 XOR 연산을 한다면 어떻게 될까 



원래 뭐였는지 알아볼수 없게 되었다. XOR최고!


댓글 로드 중…

블로그 정보

Clolent - 커피물조절달인

최근에 게시된 글