[보안] 대칭키 암호 1. 스트림 암호

yujeongkwon·2023년 10월 9일

보안

목록 보기
4/10
post-thumbnail
  • 대칭키 암호는 크게 스트림 암호와 블록 암호로 구분됨.
    • 평문의 길이를 얼마만큼에 하냐에따라 블록 암호, 스트림 암호로 나뉨
  • 스트림 암호 먼저보고 블록 암호 이후에 보쟈~근데 대칭키 중에서 스트림 암호보다는 블록 암호가 중요함~
  • 대칭키 암호는 암호화키 복호화키가 같다는걸 주의하고 들어가자~

스트림 암호

  • 비트단위로 암호화하는 대칭키 암호
  • 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)를 사용함
      • = 64비트의 키 →2^64개의 비트열
    • 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의 각 단계는 바이트를 생성
      • 소프트웨어 효율성

profile
인생 살자.

0개의 댓글