2016년 6월 24일 금요일

XOR을 이용한 암호화

XOR은 CPU에서 제공하는 연산으로, 이 연산의 [A ^ B = C 의 경우 두 값을 알면 나머지 한 값도 알 수 있다]는 성질을 이용하여 암호화를 할 수 있다.

XOR을 이용하여 암호화를 진행하면 다음과 같은 모양이 된다.


평문을 16진수로 바꾸어(아스키 코드) 키와 XOR 연산을 했고, 그 결과를 가지고 있다가 복호화 해야 하는 경우 다시 나만 알고 있는 키로 XOR 하여 원문을 구할 수 있다.

아주 빠른 속도로 암호화/복호화를 할 수 있지만 단점이 많다. 가장 큰 문제는 뚫기가 쉽다는 것. 키의 크기와 키 자체를 알아내기가 쉽다.

만약 어떤 프로그램에서 채팅을 암호화 한다고 하면(난이도를 쉽게 하기 위해) 채팅창에  "AAAAAAAAAAAAAAAAAAA"라고 써본다. 그리고 날라가는 패킷을 보면

6E2AE83 6E2AE83 6E2AE83 6E2AE83 .... 6E2AE83 6E2AE83 6E2AE83 6E2AE83

이렇게 돼 있는 것을 볼 수 있을 것이다. 만약 XOR을 사용해서 암호화 했다는 것을 알면 (가장 흔한 방법임으로 한 번 시도해볼 수 있음) 패킷을 보면 같은 문자인데 4바이트 단위로 암호화된 문자가 반복되고 있다는 것을 알 수 있다. 

그러면 이제 다음을 계산해본다.

6E2AE83 XOR 41414141 (AAAA의 아스키 코드 값)

그럼 계산기에 다음과 같은 값이 나오고, 그 값은 KEY가 된다.

47A3EFC2

이렇듯 쉽게 키를 알아낼 수 있고, 키를 알아내지 않더라도 전달되는 데이터의 일부를 변경할 수 있다는 문제점도 있다. 단순히 특정 비트-바이트의 값을 수정하는 것 만으로도 원하는 데이터를 변형할 수 있다.


댓글 1개: