Shine's dev log

RC4 암호 알고리즘 본문

보안

RC4 암호 알고리즘

dong1 2020. 5. 14. 18:08

대칭키 암호에는 블록암호와 스트림 암호가 있는데, 앞서 살펴본 AES와 DES는 대표적인 블록암호이다.

 

이번에는 스트림 암호에 대하여 알아보자.

 

 

 

1. 스트림 암호 (Stream Cipher)

 

연속적인 비트/바이트/단어들을 순차적으로 암호화하는 방식

 

블록암호는 일정한 크기의 데이터를 하나의 블록으로 묶어서 암호화했다면, 스트림암호는 묶지 않고, 별개의 데이터들에 순차적으로 암호화를 적용해주는 방식이다.

 

Stream Cipher

 

주로 위의 그림과 같이 유사난수를 1비트 단위로 생성하고, 암호화하려는 데이터와 XOR하여 1비트의 암호문을 얻는 식으로 많이 사용된다.

 

스트림 암호는 블록암호만큼 안전하며, 더 빠르고 간단하다는 특징이 있다.

 

 

 

2. RC4

 

RC4는 SSL/TLS나 네트워킹 프로토콜에서 자주 사용되는 스트림 암호기법으로, 굉장히 빠르다는 장점이 있다.

 

RC4는 평문과 XOR연산할 pseudoramdom stream을 만들어낸다. (Key stream) 그래서 RC4 자체를 난수 생성기로 사용할 수도 있다.

 

RC4는 상태(state)개념을 사용한다. 

S[0] S[1] S[2] S[3] ... S[255]
256 바이트로 구성된 상태(state)의 한 바이트는 암호화 키로서 사용되기 위해 랜덤하게 선택된다.

 

  • 초기화 단계 (The Key-scheduling Algorithm; KSA)

초기화는 우선, 256바이트의 state vector를 0, 1, 2, ... 255로 초기화시킨다.

 

또한 키배열(K[0] K[1] K[2] ... K[255])도 생성되는데, 이곳에는 키가 복사된다. 

 

만약, 키의 길이가 256바이트라면 그대로 복사시키고, 256바이트보다 짧다면, 키배열이 꽉 찰때까지 반복적으로 복사한다.

 

이제, 상태 배열과 키배열 256바이트가 준비되어있을 것이다. 이제, 키배열을 이용하여 상태배열을 swap해준다.

 

  • The pseudo-random generation algorithm (PRGA)

이제 완벽히 뒤섞여진 상태배열 (S[0] S[1] S[2] ... S[255]) 이 준비되어있을 것이다.

 

1) 상태배열은 두개의 독립변수 i,j를 기반으로 swap될 것이다.

 

2) i번째와 j번째의 두 상태원소의 값은 키를 생성하기위한 상태배열의 인덱스를 정하기 위해 사용된다.

 

PRGA

 

위의 그림에서 확인할 수 있듯이, S[i] + S[j]의 값에 해당하는 상태배열의 인덱스의 원소가 키다. (말이 어렵군.. 그림으로 이해하시길)

 

아무튼 상태배열의 원소는 1바이트이므로 생성된 키도 1바이트이다.

 

이렇게 생성된 1바이트 키를 가지고 1바이트 평문을 암호화 시킨다.

 

평문이 끝날때까지, 이 키 PRGA는 계속된다. (KSA 는 처음 한번만 시행한다.)

 

 

 

3. RC4의 안전성

 

과거에는 정말 많은 분야에서 쓰였던 RC4가 여러가지 안전성 문제로 요즘에는 사용이 권장되지 않고 있다.

 

1) RC4로 생성된 키스트림의 일부값이 편향되게 나온다.

 

2) 의사난수가 완벽한 난수가 아니므로 안전성 문제가 있다.

 

 

 

오늘 배운 내용을 정리해보면,

 

1. RC4는 대표적인 스트림 암호이다.

 

2. RC4는 초기화 과정인 KSA, 1바이트 키를 생성해내는 PRGA과정으로 구성되어 있다.

 

3. KSA는 한번, PRGA는 평문이 끝날때까지 반복된다.

 

4. RC4는 안전하지 않다.

 

본 내용은 공부하며 정리한 것으로, 오류가 있을 수 있습니다.

 

'보안' 카테고리의 다른 글

메세지 인증 (Message Authentication)  (1) 2020.05.15
블록 암호 운용방식 (Modes of operation)  (0) 2020.05.14
AES 암호화  (0) 2020.05.08
DES 암호화  (0) 2020.05.07
블록암호(Block cipher)와 스트림암호(Stream cipher)  (0) 2020.05.06