[정보 보안] 블록 암호와 DES (feistel)

2023. 10. 19. 12:00·공부/보안
728x90

암호 기법은 평문을 처리하는 방법에 따라서 스트림 암호와 블록 암호로 나뉜다.

 

스트림 암호는 난수를 1비트 단위로 생성하고 평문과 xor 연산을 해서 암호화를 진행한다.

http://www.ktword.co.kr/test/view/view.php?m_temp1=5541

스트림 암호가 1비트 단위로 암호화를 했다면 블록 암호는 여러 개의 비트로 이루어진 블록 단위로 암호화를 진행한다.

 

이번 포스팅에서는 블록 암호에 대해 알아보고 대표적인 DES에 대해 알아보려고 한다.

 

feistel cipher

feistel cipher는 블록 암호의 일종이고 알고리즘이 아니라 일종의 프레임워크이다.

 

대부분의 블록 암호는 feistel cipher를 따른다.

 

1. 평문을 같은 길이의 두 정보로 쪼갠다.

 

2. 라운드 i에서 사용하는 키를 K(i)라고 하고 라운드 함수를 F로 놓는다.

 

3. R0는 그대로 그 다음 단계로 넘어가는데 오른쪽이 아닌 왼쪽으로(L1) 보낸다.

 

4. R0와 K0를 사용하여 라운드 함수를 거친 값은 L0와 xor 연산을 해서 다음 단계로 넘어가는데 왼쪽이 아닌 오른쪽(R1)으로 보낸다.

 

이를 반복한다.

 

전체 과정을 그림으로 보면 아래와 같다.

https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%EC%8A%A4%ED%85%94_%EC%95%94%ED%98%B8

이 구조를 요약하자면 서브 키 K(i)를 사용하여 R(i)에 라운드 함수 F를 적용한다.

 

그리고 그 값을 L(i)와 xor 연산을 해서 치환한다.

 

좌우 결과를 교환하여 전치한다. 

 

이렇게 확산(diffusion)과 혼돈(confusion) 특성을 가진다.

 

DES (Data Encryption Standard)

DES 역시 위와 같은 feistel cipher 구조를 따른다.

 

DES의 one round 구조는 다음과 같다.

 

https://www.researchgate.net/figure/Single-round-of-the-DES-Algorithm-11_fig4_367166170

하나씩 살펴보자.

 

먼저 연산에 들어가기 전에 절반으로 나누고 R0에 expansion permutation 연산을 적용한다.

expansion permutation

64 비트를 반으로 나눈 32 비트를 48 비트로 늘린다.

https://crypto.stackexchange.com/questions/42650/des-and-feistel-cipher

이렇게 구한 값을 서브키 K(i)와 xor 연산을 적용한다.

S - boxes

xor 연산을 적용한 비트의 개수는 48개이다.

 

그리고 48비트가 S - boxes를 거쳐서 32비트가 되는 모습을 확인할 수 있다.

 

이 과정은 다음과 같이 총 8개의 S-box에 비트가 나누어서 들어간다.

 

6비트가 4비트로 바뀌는 S-box는 다음과 같은 테이블을 사용한다.

http://wiki.hash.kr/index.php/%ED%8C%8C%EC%9D%BC:%EC%97%90%EC%8A%A4%EB%B0%95%EC%8A%A4.png

P - box

permutation을 의미하는 P-box는 32비트를 받아서 위치를 바꾼 후 같은 32 비트를 반환한다.

이렇게 구한 최종 적인 값을 원래의 L0와 xor 연산을 해서 그 다음 단계의 R1의 값이 된다. (L1은 R0 값 그대로 사용)

이것이 하나의 라운드에서의 연산이다.

 

다음은 DES에서 사용되는 값들이다.

블록 길이  64 bit
키 길이 56 bit 
라운드 횟수 16 번
각각의 라운드 마다 쓰는 키(sub key) 길이   48 bit

참고로 DES의 안정성은 주로 S-box에 달려있다.

 

DES key

이제 하나의 라운드에서 sub key가 만들어지는 과정을 살펴보자.

 

먼저 키를 반절로 나누어서 섞는다.

그리고 circular shift 연산을 적용한다.

위 그림은 한 칸씩 이동하는 shift 연산인데 각 라운드마다 이동하는 정도는 다르게 한다.

 

이후 압축하여 총 56비트를 48비트로 줄인다.

 

728x90

'공부 > 보안' 카테고리의 다른 글

[보안] SSL/TLS 인증서 발급 과정 및 인증 절차  (0) 2023.10.30
[보안] 대칭키, 비대칭키(공개키), 혼합  (0) 2023.10.28
[정보 보안] 고전 암호 기법 (전치)  (1) 2023.10.17
[정보 보안] 고전 암호 기법 (치환)  (0) 2023.10.16
'공부/보안' 카테고리의 다른 글
  • [보안] SSL/TLS 인증서 발급 과정 및 인증 절차
  • [보안] 대칭키, 비대칭키(공개키), 혼합
  • [정보 보안] 고전 암호 기법 (전치)
  • [정보 보안] 고전 암호 기법 (치환)
웅대
웅대
알고리즘과 백엔드를 중심으로 열심히 공부 중입니다! 같이 소통하며 공부해요!
    250x250
  • 웅대
    웅대 개발 블로그
    웅대
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • dp
        • 문자열
        • 정렬
        • 스택
        • 브루트 포스
        • 이진 탐색
        • 정리
        • 우선순위 큐
        • 자료구조
        • 그래프
        • 기타
        • 그리디
      • 컴퓨터 언어
        • Kotlin
        • Python
        • C#
      • 공부
        • Database
        • Android Studio
        • Algorithm
        • 컴퓨터 구조론
        • Spring
        • lombok
        • AWS
        • Network
        • OS
        • Git & GitHub
        • AI
        • Computer Vision
        • 보안
        • Nginx
        • 프론트
        • express
        • GCP
        • grokking concurrency
        • DevOps
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ci/cd
    parametric search
    파이썬
    binary search
    다익스트라
    RNN
    nn.RNN
    AWS Lambda
    ChatPromptTemplate
    codetree
    Merge
    스택
    embedding
    푸쉬 알람
    스프링 OAuth2
    Vector Store
    openvidu 배포
    influxDB CLI
    bfs
    code tree
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
웅대
[정보 보안] 블록 암호와 DES (feistel)
상단으로

티스토리툴바