2015년 9월 6일 일요일

[C/C++] RC4 스트림 암호 구현




Download link :







  RC4 암호는 바이트 단위로 데이터를 암호화하는 방법입니다. RSA 공개키 암호체계의

발명가 중 한명인 로널드 로린 라이베스트(Ronald Lorin Rivest)가 고안한

스트림 암호체계입니다. RSA처럼 RC4 또한 라이베스트의 성 이니셜 R이 들어갔습니다.

(Rivest Cipher 4)


  스트림 암호(Stream cipher)는 RSA와는 다른 대칭 키 암호 구조입니다.

유사난수를 연속적으로 생성하여 암호화하려는 평문과 XOR 연산합니다. "A5/1"은

비트단위로 평문에 XOR하는 반면 RC4 알고리즘은 바이트 단위로 XOR 연산합니다.

XOR 연산은 "A"와 "B"가 서로 같은 대칭키를 가지고 있다면 아주 간단히

암호문을 만들 수 있게 해줍니다. 어떤 Key 값으로 XOR 연산한 암호문은, 같은 Key

값으로 다시 XOR 연산하면 다시 평문으로 복원되기 때문이죠.



  XOR 연산은 같은 자리수에서 같은 비트면 0, 다른 비트를 가지면 1로 변환시킵니다.

RC4 암호화는 결국 XOR 연산으로 암호화-복호화하지만, 그 XOR 연산을 할 Key stream

byte를 선택하는데 있어서, 셔플링 기법을 써서 난수적으로 얻습니다. 평문은 매

바이트마다 다른 난수로 암호화됩니다.



  코드를 나눠잘라보면서 말씀드리겠습니다. 주석처리된 소소코드를 게시물 상단에

다운로드 링크해두었습니다. 콘솔 환경의 Qt 프레임워크에서 구현되었지만, 

Visual Studio에서도 포함 헤더파일만 다를 뿐 거의 차이가 없을 것입니다.





  셔플링에 사용할 swap() 함수를 사용하기 위해 "cstring" 헤더파일을 포함했습니다. 

"unsigned char" 형 데이터를 byte형 타입으로 두었습니다. Visual Studio의 경우에는

"windows.h" 헤더파일을 포함하는 것으로 byte형 타입을 사용할 수 있습니다. 암호화할

평문은 "Rivest", 암호화에 사용할 key 값은 "Ramen"으로 했습니다.



  배열 S는 초기화 과정에서 0부터 255까지의 256개 데이터를 순열로 담고 있다가,

셔플링을 거친 후 무작위로 섞이는 수들을 가집니다.

배열 K는 초기화 과정에서 Key 값의 길이만큼 반복되는 수를 가집니다.

Key가 "Ramen"이라면, 길이가 5자 이기에 "R", "a", "m", "e", "n", "R", "a"...

라는 값들이 256개 담깁니다. 배열 K는 오직 배열 S의 셔플링을 위해서만 쓰입니다.

"key_Streambyte"는 최종 암호화 과정에서 배열 S에 담긴 0~255 사이의 값 중 하나로

선택되어 평문과 직접 XOR 연산을 수행합니다. 물론 대칭키 암호체계이기에

상대방이 이 값을 알고 다시 XOR 연산을 해야 평문으로 복원할 수 있습니다.



  배열 S와 K를 초기화하고 S를 셔플링합니다. 저 셔플링 과정을 거치면,


0부터 255까지의 값들이 겹치지 않으면서 뒤죽박죽 섞이게 됩니다. 보시는 바와 같이

key 값 "Ramen"이 배열 K에 담겨져 셔플링에 참여하고 있습니다.




  다시 규칙에 따라 swap()한 뒤에 이번에 선택된 i와 j 값이 배열 S의 원소를 통해

"key_Streambyte"를 결정하는 변수 "t"를 결정합니다. 평문의 길이만큼 반복되면서

매번 다른 key_Streambyte가 평문에 XOR 연산해 암호문을 만듭니다. 소스코드에서는

XOR 연산은 바로 다시해 복호화시켜서 평문이 그대로 나타나게 됩니다.



  Key 값 "Ramen"에 의해 암호성을 띄는 key_Streambyte가 매 바이트마다

XOR 연산에 기여합니다. XOR 연산을 다시 한번 해서 복호화 하지 않은 값은 난해한

데이터입니다.


  매번 바이트마다 XOR 연산을 한 key_Streambyte를 상대방이 알고있다면 우리가 보낸

"Rivest"라는 평문을 복원할 수 있습니다. 



  C++에서의 RC4 암호화 알고리즘 구현을 마칩니다. 본 프로그램은 제가 교재를 보고

따라 만든 것이므로 오류가 있을 수 있습니다. 사실 대칭키 기반 암호화 알고리즘인 RC4는

이미 연구를 통해 취약성이 드러났다고 합니다. 대칭키는 사전에 앨리스와 밥이 서로의

key 값을 공유해야하는 점이 난관이죠. 하지만 바이트 단위라서 구현이 간편하고

속도가 빠른 점이 장점이라서 통신 모듈을 테스트할 때 넣어볼까하다가..

요즘 나오는 와이파이 모듈은 기본적으로 여러 암호화 방법을 지원하더군요..


  대칭키 암호화에 비해 RSA와 같은 공개키 암호화는 소수(Prime number)의 수학적

난해함을 기반으로하기에, 가까운 시일 내에 RSA를 소개하는 글로 찾아뵜으면 좋겠습니다.

컴퓨터 보안 과목을 배우면서 무언가를 숨기는 것은, 무언가를 한다는 것과 중요성이

같다는 생각이 많이 들었었습니다.



댓글 3개:

  1. 책에서 읽기만 했을 땐 무슨 말인지 잘 몰랐는데 이해에 도움이 되네요 감사합니다

    답글삭제
  2. 안녕하세요! 궁금한게 있는데요, 배열 K는 문자가 담겨있고, 배열 S에는 숫자가 담겨있는데, XOR계산이 어떻게 가능한건가요?

    답글삭제
  3. [아래로 _ ]: [C/C++] Rc4 스트림 암호 구현 >>>>> Download Now

    >>>>> Download Full

    [아래로 _ ]: [C/C++] Rc4 스트림 암호 구현 >>>>> Download LINK

    >>>>> Download Now

    [아래로 _ ]: [C/C++] Rc4 스트림 암호 구현 >>>>> Download Full

    >>>>> Download LINK

    답글삭제