공부 기록

[정보보안] Stream Cipher

by 너나나

Stream cipher :

대칭 키 암호(symmetric-key algorithm)의 구조 중 하나로 pseudorandom number을 연속적으로 생성하여 암호화하려는 자료와 결합하는 구조를 가진다.

일반적인 스트림 암호는 pseudorandom number을 1비트 단위로 생성하고, 생성된 값과 암호화하려는 각 값을 XOR하여 1비트의 암호화된 자료를 얻는다!!

stream cipher

1 bit를 XOR 연산을 해보자!!

A   1 1 1 0 0 1 1 0
B ^ 1 0 1 0 1 0 1 0

A와 B를 XOR 하면 01001100 이 나온다!!!

여기서 B를 한번더 XOR 해보자!! (A^B^B)

A   1 1 1 0 0 1 1 0
B ^ 1 0 1 0 1 0 1 0
B ^ 1 0 1 0 1 0 1 0

그러면 11100110이 나오는데 이 값은 A와 같다!! 그니까 A^B^B = A다.

이거를 Encryption과 decryption에 적용해보면 우리가 암호화 할때 xor연산에 썼던 키 값을 해독하는 사람이 알고있으면 그냥 xor연산 때려버리면 원래 값이 나온다!!

그러니까 encryption : P^K (P : plaintext, K : key, C : ciphertext)

decryption : (P^K)^K = C^K

이렇게 할 수 있다는 것이다!!!

코드로 나타내면

int main() {
	int str_size=0, key_size=0, cElement=0;
	char key[128], text[128], c_text[128], d_text[128];

	printf("키 입력: "); 
	scanf("%s", key); 
	key_size=strlen(key);
	printf("평문 입력: "); 
	scanf("%s", text); 
	str_size=strlen(text);

	for(cElement=0; cElement<str_size; cElement++){ 
		if (key_size>=str_size)
			c_text[cElement]=text[cElement]^key[cElement]; 
 		else
			c_text[cElement]=text[cElement]^key[cElement%key_size]; 
	}
    
	printf("암호문: ");
	for(cElement=0; cElement<str_size; cElement++)
		printf("%c", c_text[cElement]); 
	printf("\n");

	for(cElement=0; cElement<str_size; cElement++){ 
		if (key_size>=str_size)
			d_text[cElement]=c_text[cElement]^key[cElement]; 
		else
			d_text[cElement]=c_text[cElement]^key[cElement%key_size]; 
	}
    
	printf("복호문: ");
	for(cElement=0; cElement<str_size; cElement++){
		printf("%c", d_text[cElement]); 
	}
	printf("\n");

	return 0; 
}

이렇다!!!

 

stream key의 임의성(randomness)가 메세지의 통계적인 특징을 파괴한다.

stream key는 절대 재사용하지 않는다. 그렇지않으면 메세지를 복구할 수 있음!!

 

Types of Stream Cipher :

stream cipher은 유한 상태 기계(finite state machin)이다. -> finite input, fixed memory size, deterministic

두가지 주요 타입이 있다!! :

Key-auto-Key (KAK, synchoronous)

  • state determined by last bits of keystream
  • Sender and receiver must be in-synch
  • Can precompute keystream
  • Example: RC4, block cipher in OFBmode

synchronous

Ciphertext-auto-key (CTAK, self-synchronizing)

  • state determined by last bits of ciphertext
  • Use n previous ciphertext bits to compute keystream
  • Can't precompute keystream
  • Example: Block cipher in ciphertext feedback (CFB) mode

self synchronizing

RC4

두가지 부분으로 구성돼있다

  • Key Scheduling Algorithm (KSA)
  • Pseudo-Random Generation Algorithm (PRGA)

KSA

  • State array를 만든다
  • secret key를 이용해 state Vector S를 초기화 하고 순서를 바꾼다(swap).
  • 8-bit index pointer i 와 j를 사용

KSA 후에 input key와 temporary vector T는 더이상 사용되지않는다!!

 

PRGA

키 스트림 k를 하나씩 생성한다. 이 생성된 1바이트 키로 1바이트 평문을 암호화시킨다!!

i = j = 0;
while (more_byte_to_encrypt) // 평문이 끝날때까지
    i = (i + 1)mod256;
    j = (j + S[i])mod256;
    swap(S[i], S[j]);
    k = (S[i] + S[j])mod256;
    C_i = M_i XOR S[k]

RC4 Lookup Stage

output byte는 S[i]와 S[j]값을 조회해서 modulo 256을 한 다음에 S의 합계를 조회하여 선택된다!!! 이게 뭔소리지??ㅋㅋㅋ

S[[i]+S[j]]는 key stream(k)의 바이트로 사용됨!

출처 : https://en.wikipedia.org/wiki/File:RC4.svg
Overall Operation of RC4; 대충 그림보고 이해하면 될듯!!!!

Decryption Using RC4

  • encryption phase와 같은 secret key 사용
  • KSA와 PRGA로 keystream 만듦
  • encrypted text와 keystream xor

블로그의 정보

공부 기록

너나나

활동하기