Stream cipher와 block cipher의 모드

Stream cipher

 

Stream cipher는 암호화에서 사용되는 symmetric key 암호화 기술중 하나이다.
이 기술은 평문과 비트 스트림으로 구성된 키를 사용하여 데이터를 암호화한다.

 

 

위 그림에 나와있듯이, stream cipher는 평문과 키를 XOR 연산으로 결합한다. 이를 통해 원본 데이터의 패턴이나 구조를 유지하면서 암호화할 수 있다.

이 암호는 길이가 n 인 키 K 를 가지며, 이를 통해 키스트림(Key Stream)을 생성한다.

이래서 스트림 암호라는 이름이 붙었나 보다.

 

Stream cipher의 장점은 데이터가 스트림으로 처리되기 때문에 큰 데이터를 실시간으로 암호화할 수 있어서 block cipher보다 빠르다.

 

 

 

Stream cipher는 키 하나를 만들어서 암호화시키면 동일한 키로 암호문을 복호화시킬 수 있는 특징이 있는데

이러한 특징으로 인해 데이터 스트림의 실시간 암호화 및 복호화에 적합하며, 특히 통신이나 스트리밍 데이터를 처리할 때 유용하다.

하지만 반대로 이러한 특징 때문에 key는 한번 사용한 후에 다시 발급받아야 한다.

같은 이유로 키 스트림은 예측 불가능한 Random number를 사용해야 한다.

 

 

 

 

 

이런 스트림 암호화에 사용된 알고리즘으로 RC4가 있다.

Rivest Cipher 4의 줄임말로, Ron Rivest가 개발한 대칭 키 알고리즘 중 하나다.

 

이 알고리즘은 특히 속도가 빠르고 간단한 구조로 인해 많은 응용 프로그램에서 사용됐지만, 취약점이 많아 암호화의 안전성을 이유로 현재는 보안상 권장되지 않는다.

 

 

방금 RC4는 아주 간단한 구조를 가지고 있다고 했다. 

키 스케줄링 알고리즘을 사용하여 초기화 된 상태의 내부 상태 배열을 생성하고, 이 배열을 사용하여 평문과 XOR 연산으로 암호문을 생성한다. 

이 과정은 반복적으로 수행되어 암호화 및 복호화에 동일한 키 스트림을 사용한다.

 

 

 

키 스케줄링 알고리즘(KSA)은 초기 순열 배열 S를 생성한다.

배열 S는 0부터 255까지의 숫자로 초기화되며, 키를 사용하여 배열의 값들을 섞는다.

S[0]=0, S[1]=1, . . ., S[255]=255

 

 

이후, KSA에 의해 생성된 배열 S를 사용하여 키 스트림을 생성한다.

이 과정에서는 S의 값들을 반복적으로 섞고, 그 결과로 나온 값들을 키 스트림으로 사용한다.

 

/* Initialization */
for i=0 to 255 do
	S[i] = i;
	T[i] = K[i mod keylen];

 

 

 

 

 

아까 생성한 초기 순열 배열 S를 배열 T를 이용하여 섞는다.

/* Initial Permutation of S */
j=0;
for i=0 to 255 do
	j = (j+ S[i]+T[i]) mod 256;
	Swap(S[i], S[j])

 

 

 

 

다음으로,  각 S[i]에 대해 S[i]와 S[j]를 교환한다. S[255]에 도달한 후 S[0]에서 다시 시작하는 프로세스를 반복한다.

/*Stream Generation*/
i, j =0;
while (true)
	i = (i+1) mod 256;
	j = (j+S[i]) mod 256;
	Swap(S[i], S[j]);
	t = (S[i]+S[j]) mod 256;
	k = S[t];

 

 

 

stream generation

 

 

 


 

 

block cipher 보완 - operation mode

 

block cipher의 한계는 plaintexts의 길이가 고정되어 있다는 것이었다.

하지만 이런 한계를 극복하고자,
다양한 사이즈의 plaintext를 block cipher로 암호화시키기 위해 operation mode를 만들었다.

 

  • Electronic Codebook (ECB) Mode
  • Cipher Block Chaining (CBC) Mode
  • Cipher Feedback (CFB) Mode
  • Output Feedback (OFB) Mode
  • Counter (CTR) Mode

 

 

 

ECB 모드

Enc(K, Pi) = Ci
Dec(K, Ci) = Pi 로 암호화와 복호화를 정의한다.

 

 

장점으로 블록 동기화가 필요하지 않다.
>> 전송 오류는 해당 블록에만 영향을 끼침. >> 병렬화 가능

단점은 결정론적 암호화를 한다는 것이다. 이것은 substitution 공격에 대해 안전하지 않다.

 

 

 

 

 

Cipher Block Chaining (CBC) Mode

 

 

 

아래는 CBC의 ENC과 DEC이다.

 

다같이 chain되어 있다.

초기화 벡터 IV 를 사용하는 것으로 randomize한다.

여기서 벡터 IV 는 예측할 수 없어야한다. 만약에 몇몇 전송에서 예측 가능하다면, 바로 공격당할 수 있다.

 

 

 

 

 

Cipher Feedback (CFB) Mode

여기서 Fs는 입력된 첫 번째 s 비트가 반환되는 함수를 말한다.

이 연산 역시 초기화 벡터 IV 를 사용하는 것으로 randomize한다.

stream cipher로 block으로 쌓는 것으로서 block cipher를 사용한다.

 

 

 

 

 

Output Feedback (OFB) Mode

stream cipher로 block으로 쌓는 것으로서 block cipher를 사용한다.

초기화벡터로 랜덤화시키고, block cipher 계산은 plaintext와 독립적이므로 X를 미리 계산할 수 있다.

 

 

 

 

 

Counter (CTR) Mode

 

CFB, OFB와 같이 stream cipher로 block으로 쌓는 것으로서 block cipher를 사용한다.

만약 CTR이 바뀐다면 비 결정론적 방식이 된다.

병렬화시킬 수 있고 미리 계산할 수 있다.