
- 대칭키 암호는 크게 스트림 암호와 블록 암호로 구분됨.
- 평문의 길이를 얼마만큼에 하냐에따라 블록 암호, 스트림 암호로 나뉨
- 스트림 암호 먼저보고 블록 암호 이후에 보쟈~근데 대칭키 중에서 스트림 암호보다는 블록 암호가 중요함~
- 대칭키 암호는 암호화키 복호화키가 같다는걸 주의하고 들어가자~
스트림 암호
비트단위로 암호화하는 대칭키 암호
xor 연산(⨁) 사용
- 좋은 통계적 특성을 가짐
- 키 스트림(si)가 충분히 랜덤하다면 암호문의 0과 1의 비율은 동일해짐
- xor은 연산과 역변환 연산이 동일해서 편함
- 연산이 간단하고 암/복호화 과정이 같음
- 암호문(yi) = 평문(xi) ⨁ 키 스트림(si)
- 평문(xi) = 암호문(yi) ⨁ 키 스트림(si)
- 원리 : x ⨁ s = y => x ⨁ s ⨁ s = y ⨁ s = x
- 작고 빨라서 임베디드 장치에서 사용함
- 단순 성능 3DES < DES < AES < RC4(스트림)
키 스트림
- 키 스트림은 원타임 패드처럼 사용됨.
- 원 타임 패드 : 키를 한번만 사용
- 키가 ㄹㅇ 랜덤하면 세상에서 젤 안전
- but 키 전달, 키 길이 = 메시지 길이만큼 있어야한다는 단점 존재
- 키 스트림 재사용 x
- 키 스트림 길이 = 평문의 길이
- 키 스트림의 2가지 생성방법
- 동기식 스트림 암호 : 𝑠𝑖 = 𝑓(𝑘)
- 독립적? 각각의 평문은 키랑만 뽕짝 해서 암호문 나옴
- 비동기식 스트림 암호 : 𝑠𝑖 = 𝑓(𝑘, 𝑦𝑖−1)
- 서로 연관됨. 평문은 이전 블록의 암호문이랑 키랑 뽕짝해서 암호문 나옴
- key스트림은 따라서 완전
랜덤(예측불가)하고 재생성해야하는 2가지 특징을 가짐
- 송수진자가 스트림 키를 재생성해야함 -> 일회용 패드처럼 사용하니까
- 키 스트림 전달 문제 발생
- 대칭키에서도 키전달 문제가 생기듯이 스트림 암호에서도 스트림 전달에서 문제가 생김.
- 스트림 키 길이는 평문의 길이와 같아서 안전하게 전달하려면 비용이 많이 듬
ㄴ=> 따라서 실제로 키 스트림 전체를 전달하지 않고, 일정한 길이의 키값 k만 전달 함.
- 키 스트림 전달이 현실적으로 불가하니 수신측에서 키 스트림을 생성
- 이는 key와 키 스트림 생성기를 통해 평문의 길이만큼의 스트림(si)을 재생성해서 복호화 함.
- 같은 입력으로 만들때마다 달라지면 안되고 입력이 같으면 항상 같은 값을 생성해야함
- 이를 위해서는 키스트림 제너레이트가 충분히 랜덤해야함
→ 안전성에 직결됨, 0과 1의 비율이 동일해야 안전한거임
- xor 특성상 1이 넘 많으면 다 바뀐거, 0이 넘많으면 거의 안바뀐거 + 수의 배열이 패턴없이 무작위 해야함
- 키 스트림를 재생성
- y가 피드백되는 방식
- 송신측에서는 맨처음 얻은 암호문 y0은 key만 키스트림 생성기에 넣고 출력된 si와 xi를 xor 해서 yi를 생성함.
- 이후부터 송신할 때, 나온 y0을 키스트림생성기에 넣어서 s1만들고 ~~ 돌려돌려
- 복호화 할때는(수신측)
- 맨처음 k를 가지고 잇고 y0을 수신 받으면 k와 y0을 xor 하여 평문 x0을 수신하고, 이후 부터 암호문을 받으면 키 스트림 생성기에 y0를 넣어서 s1 만들기
ㄴ-> 수신측에서 si 구하기 : key를 키스트림 생성기에 넣어서 생성
ㄴ-> 앞서 말햇듯이 xor연산은 연산, 역역산이 같아서 구한 k와 y0를 xor하면 평문 xi를 구할 수 있음.
- ex) 받는측에서 지금 11번째 암호문인 y11을 받았따면 이전에 받은 y10이랑 가지고 잇는 키 k로 키스트림 생성기에 넣어서 s11을만듬 → y11이랑 s11이랑 xor하면 평문x11을 얻을 수 있음.
- 스트림 암호 같은 경우 PRNG를 키스트림 제너레이터로 사용함
스트림 암호 종류
- A5/1
- 3개의 선형 피드백 Shift 레지스터(Linear Feedback Shift Registers)를 사용함
- GSM 휴대폰 시스템에 사용됨
- 이제부터 각 LFSRs에 X,Y,Z 라벨을 붙여서 부를 거임
- X: 19 bits (x0,x1,x2,…,x18)
- Y: 22 bits (y0,y1,y2,…,y21)
- Z: 23 bits (z0,z1,z2,…,z22)
- X,Y,Z 각 단계에서 하는 연산
- At each step: m = maj(x8, y10, z10)
- Examples: maj(0,1,0) = 0 and maj(1,1,0) = 1
- If x8 = m then X steps
- t = x13 ⨁ x16 ⨁ x17 ⨁ x18
- xi = x(i−1) for i = 18,17,…,1 and x0 = t
- If y10 = m then Y steps
- t = y20 ⨁ y21
- yi = y(i−1) for i = 21,20,…,1 and y0= t
- If z10 = m then Z steps
- t = z7 ⨁ z20 ⨁ z21 ⨁ z22
- zi = z(i−1) for i = 22,21,…,1 and z0 = t
- 모든 과정을 마치면 키스트림 비트 s = x18 ⨁ y21 ⨁ z22 가 생성됨.

- RC4
- 변경되는 조회 테이블 기준
- 여러곳에 사용됨
- RC4의 각 단계는 바이트를 생성