본문 바로가기
Xcode/Swift - PlayGround

PlayGround ) Swift로 RC4 알고리즘에 대해 알아보자!

by 후르륵짭짭 2020. 10. 5.
728x90
반응형

안녕하세요 후르륵짭짭 입니다.

추석 연휴가 끝났습니다. ㅠ ㅠ

이번에는 2014년 WWDC Swift 언어가 처음으로 공개 됐을 때, 

Swift의 장점인 빠르다를 소개하면서 나왔던 RC4에 대해 설명하려고 합니다.

(사실 시스템 보안 과제였기도 했습니다 ㅎㅎㅎ)

 

** RC4란 무엇인가 ** 

Rc4 알고리즘은 대칭키 Stream Cipher 입니다.

여기서 대칭키란, 암호 할 때 Key 랑 해독할 때 Key 랑 동일한 Key를 사용하는 것을 의미합니다.

그리고 Stream Cipher (스트림 암호)는 물흐르 듯 연속적인 난수를 XOR 연산으로 생성해서 그것을 Key로 사용하는 것을 말합니다.

(그런데 취약점이 있다고 해서 잘 사용안한다고 하네요 ㅎㅎㅎ)

 

** RC4 암호체계 **

- 키 스트림이 만들어지기 위한 재료로서 임의의 배열 선언

- 배열을 안에 각 인덱스를 값으로 넣음 ( S[] = {0,1,2,3,4,5,6,7,8, ... } )

- 키값을 통해 배열의 값을 섞는다

- 정해진 규칙으로 배열을 이용해 키 스트림 생성

- XOR을 통한 암호문 생성

 

** 구현하기 **

처음에 이렇게 0 부터 255 숫자가 있는 S 배열(Lookup Table )을 생성해줍니다.

이 숫자로 Rc4의 핵심이 될 변수 입니다.

그리고 우리의 Key 값을 담을 K 배열을 만들어줍니다.

이제 Key(RC4) 와 평문(Homework)을 설정해줍니다.

그리고 Steam Cipher가 될 Key_SteamBytes 배열을 만들어 줍니다.

위에 코드를 보면 잘 이해가 안 될 수도 있는데, Key에 해당하는 (RC4)를 K 배열에 담아줍니다. 따라서 아래 그림 처럼 작동이 됩니다.

잘 안 보이는데,,, R, C, 4, R, C, 4, R, C, 4, R, C, 4 ,,, 이렇게 반복 되는 것을 확인 할 수 있습니다.

 

저렇게 그대로 놔두면 암호체계가 아니기 때문에 아래 방식으로 섞어 줍니다. ㅎㅎㅎ

(저는 사실 왜 저런 방식으로 섞는지 모르겠지만 ,,, 창시자의 마음이라 생각합니다. 교수님께 한번 물어보겠습니다.)

그럼 위에 처럼 0~255 사이의 숫자로 막 알지 못하도록 섞이게 됩니다.

 

이제 위의 코드 처럼 적어주면 Key_SteamByte가 생깁니다.

여기서 왜 inputText 길이 만큼 방복문을 돌려주는 이유는 KeyStream이랑 평문의 길이랑 같아야 XOR 연산을 할 수 있기 때문입니다.

 

RC4를 검색하면 바로 나오는 그림인데, 위에 있는 코드가 바로 저걸 의미합니다.

그러면 이렇게 KeyStream을 생성하게 되고 이것 숫자를 가지고 암호문과 복호문을 만드는 중요한 역할을 하게 됩니다.

 

이제 우리가 처음 만들어준 평문을 가지고 KeySteamByte와 XOR 연산을 해줍니다. 

RC4 알고리즘 , Stream 암호문의 핵심은 XOR 연산인데, Swift에서는 정말 빠르게 이뤄졌습니다.

그리고 마지막에 생성한 암호코드를 반환해줍니다.

(암호코드는 XOR 연산을 통해 만들어진 INT 숫자를 가리칩니다. 사실, 그냥 아스키 코드로 할려고 했는데, 아스키코드 값의 최대인 126을 넘는 숫자가 나와서 복호화 과정에서 안되더라구요,,,)

 

그리고 XOR 연산으로 만들어진 INT 배열인 암호코드를 매개변수로 넣어주고

KeyStreamByte와 다시 XOR 연산을 해준다면 복호문이 나오게 됍니다.

이렇게 암호문과 복호문이 나오게 됩니다.

 

먼가 복잡해 보이지만, 그냥 뒤섞고 XOR 연산 해주는게 전부구나를 알 수 있습니다.

그런데 여기서 중요한 것은 KeyStreamByte만 가지고 XOR 연산을 해주면 암호화 과정 복호화 과정 모두 할 수 있다는게

XOR 연산의 가장 큰 힘이라는 것을 알 수 있습니다.

 

소스코드 :

github.com/HururuekChapChap/Swift_Study/blob/master/PlayGround/RC4_Algorithm.playground/Contents.swift

 

참고 사이트 : 

g0pher.tistory.com/356

 

스트림 암호(Stream Cipher) #RC4

인터넷에서는 이해하기 어려운 내용이 주를 이뤄 검색해도 알아듣기가 쉽지 않았다.(그들은 과연 모두 이해하고 그렇게 올린것일까) 그래서 스스로 수없이 검색해보고 이해해 보며 조금이나마

g0pher.tistory.com

en.wikipedia.org/wiki/RC4

 

RC4 - Wikipedia

Stream cipher RC4GeneralDesignersRon Rivest (RSA Security)First publishedLeaked in 1994(designed in 1987)Cipher detailKey sizes40–2048 bitsState size2064 bits (1684 effective)Rounds1Speed7 cycles per byte on original Pentium[1]Modified Alleged RC4 on Int

en.wikipedia.org

mind3002.blogspot.com/2015/09/cc-rc4.html

 

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

Download link : RC4.cpp   RC4 암호는 바이트 단위로 데이터를 암호화하는 방법입니다. RSA 공개키 암호체계의 발명가 중 한명인 로널드 로린 라이베스트 (Ronald Lorin Rive...

mind3002.blogspot.com

 

728x90
반응형

댓글