정보보안 - 스트림 암호

SIK407·2023년 10월 14일
0

정보보안

목록 보기
2/2
post-thumbnail

스트림 암호(Stream cipher)

  • 정통적인 일회성 암호랑 비슷(버너)
  • KEY를 긴 비트열로 늘여서 사용
  • 일회성 암호처럼 섀년의 원칙 중, 혼돈 이론만 적용!
  • A5/1, RC4

섀년의 원칙

  • 혼돈: 평문과 암호문의 상관 관계를 없애는 성질
    -> 평문을 다른 문자로 치환
  • 확산: 평문에서 나타나는 문자의 빈도수를 없애버리는 특성.
    -> 평문의 문자 위치를 이동하는 행위



스트림 암호(Stream cipher)

  1. 길이가 N bit인 KEY를 가진다. 이 긴 KEY STREAM으로 늘리고, 평문과 XOR 연산
    -> XOR: 같으면 1, 다르면 0
  2. 물론 복호화 할때도 XOR 연산
  3. 일회성 암호의 KEY에 해당하는 패드를 사용하는 것과 동일

스트림 암호 >>> 블럭 암호로 넘어가는 이유!

  1. 시프트 레지스터는 SW에선 비효율적, HW에선 효율적
  2. 요즘 HW가 다 상향평준화가 되어서 무조건 블럭이 유리 및 효율적!

A5/1: 시프트 레지스터 (64bit 사용)

-> 세 개의 선형 피드백 Shift Registers (X, Y, Z가 있다고 가정)

X: 19bit (X0, ... ,X18)
Y: 22bit (Y0, ... ,Y21)
Z: 23bit (Z0, ... ,Z22)

X: X[13] X[16] X[17] X[18] 들을 XOR 연산
Y: Y[20] Y[21] 들을 XOR 연산
Z: Z[7] Z[20] Z[21] Z[22] 들을 XOR 연산

후에, X, Y, Z들을 Shift-Right 연산한다 (오른쪽으로 한칸 씩 이동)
그리고 맨 앞에 아까 XOR 연산한 값을 각각 넣어준다.

그래서 이 과정을 반복할 때마다, KEY STREAM의 비트 수가 하나씩 증가한다.
KEY STREAM을 평문과 XOR연산을 하게되면 암호문이 나온다.

RC4 알고리즘

  • 256 Byte 값이 들어가 있는 검색표
  • Byte 기반
  • 평문 Byte와 KEY Byte가 XOR 연산 => 암호문 Byte
// RC4 초기화 코드
// N: Key 길이
// 1. 초기화 과정은 우선 S에 순열을 대입
for (int i = 0; i < 255; i++) {
	S[i] = i;
    K[i] = Key[i % N];
}

// 0에서 255까지의 값이 정렬된 S에 K와 swap() 함수를 통해 셔플링!
int j = 0;
for (int i = 0; i < 255; i++) {
	j = (j + S[i] + K[i]) % 256
    swap(S[i], s[j]);
}
// RC4 KEY 스트림 바이트
// 평문의 바이트 길이만큼 암호화가 반복적으로 이루어짐.
i = (i + 1) % 256;
j = (j + S[i]) % 256;
swap(S[i], S[j]);
t = (S[i] + S[j]) % 256;
keystreamByte = S[t];
  1. 256 바이트의 state vector를 0, 1, 2, .... , 255로 초기화 (char S(256))
    -> 물론 key도 초기화 (key가 256보다 짧다면 계속 그대로 복사)
  2. 키값을 통해 배열의 값을 섞는다
  3. 정해진 규칙으로 배열을 이용해 KEY STREAM을 생성
  4. XOR을 통한 암호문 생성

그냥 간단하게!
KEY가 배열을 구성 -> 배열이 KEY STREAM을 구성 -> KEY STREAM이 암호문을 생성

특징!

  1. 스스로 수정하는 검색표
  2. 명쾌하고 단순하며 소프트웨어에서 효율적
  3. SSL과 WEP 프로토콜 등 많은 응용 분야에서 사용
    -> 그러나.... 8Bit 프로세서에만 최적화...
  4. 몇몇 약점 발견, 그래서 지금은 잘 안씀!

0개의 댓글