섀년의 원칙
- 혼돈: 평문과 암호문의 상관 관계를 없애는 성질
-> 평문을 다른 문자로 치환- 확산: 평문에서 나타나는 문자의 빈도수를 없애버리는 특성.
-> 평문의 문자 위치를 이동하는 행위
-> 세 개의 선형 피드백 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 초기화 코드
// 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];
그냥 간단하게!
KEY가 배열을 구성 -> 배열이 KEY STREAM을 구성 -> KEY STREAM이 암호문을 생성