안녕하세요 후르륵짭짭 입니다.
추석 연휴가 끝났습니다. ㅠ ㅠ
이번에는 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 연산의 가장 큰 힘이라는 것을 알 수 있습니다.
소스코드 :
참고 사이트 :
mind3002.blogspot.com/2015/09/cc-rc4.html
'Xcode > Swift - PlayGround' 카테고리의 다른 글
PlayGround) IOS의 Unit Test에 대해 알아보자 (0) | 2020.11.05 |
---|---|
PlayGround) Delegate와 Delegate Data Pass를 알아보자! (0) | 2020.11.04 |
PlayGround ) Design Pattern (MVC) (0) | 2020.10.02 |
PlayGround ) Viewcontroller Life Cycle 이란?? (0) | 2020.09.30 |
PlayGround ) 우선순위 큐를 구현해보도록 하자!!! (0) | 2020.09.19 |
댓글