[정보보안] Stream Cipher
by 너나나Stream cipher :
대칭 키 암호(symmetric-key algorithm)의 구조 중 하나로 pseudorandom number을 연속적으로 생성하여 암호화하려는 자료와 결합하는 구조를 가진다.
일반적인 스트림 암호는 pseudorandom number을 1비트 단위로 생성하고, 생성된 값과 암호화하려는 각 값을 XOR하여 1비트의 암호화된 자료를 얻는다!!
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
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
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)의 바이트로 사용됨!
Decryption Using RC4
- encryption phase와 같은 secret key 사용
- KSA와 PRGA로 keystream 만듦
- encrypted text와 keystream xor
'2021-1 > 정보보안' 카테고리의 다른 글
[정보보안] Hash function (2) | 2021.05.31 |
---|---|
[정보보안] Advanced Encryption Standard (AES) (0) | 2021.05.29 |
[정보보안] Block Cipher modes of Operation (2) | 2021.05.11 |
[정보보안] Data Encryption Standard (DES) (0) | 2021.05.11 |
[정보보안] Block Cipher Structure (0) | 2021.05.09 |
블로그의 정보
공부 기록
너나나