"블록암호"의 두 판 사이의 차이
(→대칭키) |
(→F함수) |
||
134번째 줄: | 134번째 줄: | ||
====F함수==== | ====F함수==== | ||
F함수에는 오른쪽의 32비트 텍스트와 키 스케줄을 거친 키가 들어간다. | F함수에는 오른쪽의 32비트 텍스트와 키 스케줄을 거친 키가 들어간다. | ||
− | [[파일:F함수.jpg| | + | [[파일:F함수.jpg|500픽셀|가운데|]] |
# 오른쪽 32비트는 E(expansion)를 거치게 되어 48비트가 된다. | # 오른쪽 32비트는 E(expansion)를 거치게 되어 48비트가 된다. | ||
# 이 48비트는 키(48비트)와 XOR연산을 하게 된다. | # 이 48비트는 키(48비트)와 XOR연산을 하게 된다. |
2019년 10월 25일 (금) 16:30 판
블록암호(block cipher)란 기밀성있는 정보를 정해진 블록 단위로 암호화하는 대칭키 암호시스템이다. 만약 암호화하려는 정보가 블록의 길이보다 길 경우에는 특정한 운용모드가 사용된다.(예 : ECB, CBC, OFB, CFB, CTR)
목차
특징
패딩
주어진 평문을 블록 암호로 암호화하기 위해서는 평문을 우선 블록 크기의 배수로 만들어야 합니다. 예를 들어 데이터 암호화 표준(Data Encryption Standard; DES)으로 암호화를 한다면 평문은 비트이어야 한다. 평문의 길이가 블록 크기의 배수가 아닌 경우, 블록 크기의 배수가 되게끔 패딩을 추가한다. 이러한 패딩을 하는 알고리즘은 PKCS#5, ANSIX923 등이 존재한다.
패딩의 가장 중요한 원칙은 으로부터 을 복구할 수 있어야 한다는 점이다. 이 원칙이 지켜지지 않으면 패딩된 메시지로부터 원본 메시지를 찾을 수 없다. 예를 들어, 평문의 길이를 32비트의 배수로 만들고 싶을 때 모자란 만큼 0으로 채워 32의 배수로 만드는 패딩을 생각해본다. 패딩된 메시지 00010011 01000111 11001000 00000000에서 실제 평문이 어디까지인지 알 수 없다. 00010011 01000111 11001000 00000000일 수도 있고, 00010011 01000111 11001000 00000000일 수도 있고, 00010011 01000111 11001000 00000000일 수도 있다. 즉 비트 단위의 올 제로(All zero) 패딩은 패딩된 메시지로부터 원본 메시지를 복구할 수 없으므로 사용할 수 없는 패딩이다.[1]
운용 방식
암호학에서 블록 암호 운용 방식은 하나의 키에서 블록 암호를 반복적으로 안전하게 이용하게하는 절차를 말한다. 블록암호는 특정한 길이의 블록 단위로 동작하기 때문에, 가변 길이 데이터를 암호화하기 위해서는 먼저 이들을 단위 블록들로 나누어야 하며, 그 블록들을 어떻게 암호화할지 정해야 하는데, 이때 블록들의 암호화 방식을 운용 방식이라 부른다.[2]
대칭키 암호화
구조
장단점
- 장점
- 블록단위 암호화로 인해 기호를 삽입하거나 제거가 불가능하고 다양한 운영 방법에 의해 혼돈과 확산의 이론을 기반으로 설계될 수 있는 것이 장점이다.
- 단점
- 블록 단위로 암호화가 이루어지기 때문에 평문 비트들이 완전한 하나의 블록으로 구성한 다음에 암호화 되므로 암호화 과정이 블록의 크기에 따라 지연된다. 즉, 암호화 시간이 느리다.
그림에서 t는 t번째를 의미한다. 즉, 일정 비트가 되어 블록이 되면 키와 암호화 함수를 이용하여 암호문 블록이 생성된다. 그리고 생성된 암호화 블록을 전송하고 이를 받은 측에서는 암호문 블럭을 다시 키와 복호 함수를 사용하여 평문 블록으로 만든다. Ct
와 Pt
사이의 관계는 각각 Ct
=E
(Pt
,K
)와 Pt
=D
(Ct
,K
)이다. 왼쪽이 암호화가 이루어지는 과정이고 오른쪽이 복호화가 이루어지는 과정이며, 암호화와 복호화에 사용되는 열쇠는 K
로 같다.
- 블록의 길이
- 블록의 길이(Pt)는 대표적으로 64비트와 128비트가 있다. 블록의 길이는 변수에 의해 지정 가능하고, 블록의 길이를 변경할 수 있는 것도 있다.
- K
- 키(Key)의 길이는 40, 56, 64, 80, 128, 192, 256비트가 있다.
- 안정성
- 블록 암호는 N비트의 키 길이에 대해 2 이상의 안정성을 가지지 않는다. 즉, 키의 전수 검색으로 반드시 해독할 수 있다. 이것은 블록암호를 정하는 경우, 매우 중요한 요소이다. 그래서 최근 짧은 키의 길이를 가진 데이터 암호화 표준(56비트)이 채용되지 않는다.
- 라운드 함수의 구성 방법에 따라 분류
- 파이스텔(Feistel) : DES, 3DES
- 대입-치환 네트워크(Substitution-Permutation Network; SPN) : 고급 암호화 표준(Advanced Encryption Standard; AES)
- 비트별 블록 암호 종류
64비트 - TDEA-ISO/IEC_18033, CRYPTREC
- MISTY1-ISO/IEC_18033, CRYPTREC, NESSIE
- CAST-128-ISO/IEC_18033
- CIPHERUNICORN-E – CRYPTREC
- Hierocrypt-L1 –CRYPTREC
- MULTI2-ARIB한정 수신 방식
- KASUMI
128비트 AES - Camellia
SEED - CIPHERUNICORN-A-CRYPTREC
- Hierocrypt-3-CRYPTREC
- SC2000 – CRYPTREC
256비트 - SHACAL-2-NESSIE
종류
전자 코드북
전자 코드북(Electronic Codebook; ECB)은 운용 방식 중 가장 간단한 구조를 가지며, 암호화하려는 메시지를 여러 블록으로 나누어 각각 암호화하는 방식으로 되어있다. 전자 코드북은 모든 블록이 같은 암호화 키를 사용하기 때문에 보안에 취약하다. 만약 암호화 메시지를 여러 부분으로 나누었을 때, 두 블록이 같은 값을 가진다면, 암호화한 결과 역시 같다. 이것은 공격자가 비슷한 메시지를 반복적으로 암호화하는 반복공격에도 취약한 성질을 가진다.
암호 블록체인
암호 블록체인(Cipher Block Chaining; CBC)방식은 1976년 IBM에 의해 개발되었다. 각 블록은 암호화되기 전에 이전 블록의 암호화 결과와 베타적 논리합(XOR)이 되며, 첫 블록의 경우에는 초기화 벡터가 사용된다. 초기화 벡터가 같은 경우 출력 결과가 항상 같기 때문에, 매 암호화마다 다른 초기화 벡터를 사용해야 한다. 암호 블록체인 방식은 현재 널리 사용되는 운용 방식 중 하나이다. 암호 블록체인은 암호화 입력 값이 이전 결과에 의존하기 때문에 병렬화가 불가능하지만, 복호화의 경우 각 블록을 복호화한 다음 이전 암호화 블록과 베타적 논리합을 하여 복구할 수 있기 때문에 병렬화할 수 있다.
암호 피드백
암호 피드백(Ciper Feedback; CFB) 방식은 암호 블록체인의 변형으로, 블록 암호를 자기 동기 스트림 암호로 변환한다. 암호 피드백의 동작 방식은 암호 블록체인과 비슷하며, 특히 암호 피드백 암호 해제 방식은 암호 블록체인 암호화의 역순과 거의 비슷하다.
출력 피드백
출력 피드백(Output Feedback; OFB)은 블록암호를 동기식 스트림 암호로 변환한다. XOR 명령의 대칭 때문에 암호화의 암호 해제 방식은 완전히 동일하다.
카운터
카운터(Counter; CTR) 방식은 블록암호를 스트림 암호로 바꾸는 구조를 가진다. 카운터 방식에서는 각 블록마다 현재 블록이 몇 번째인지 값을 얻어, 그 숫자와 논스를 결합하여 블록암호의 입력으로 사용한다. 그렇게 각 블록 암호에서 연속적인 난수를 얻은 다음 암호화하려는 문자열과 XOR한다. 카운터 모드는 각 블록의 암호화 및 복호화가 이전 블록에 의존하지 않아서 병렬적으로 동작하는 것이 가능하다. 혹은 암호화된 문자열에서 원하는 부분만 복호화하는 것도 가능하다.
암호화 알고리즘
데이터 암호화 표준
평문을 64비트로 나눠 56비트의 키를 이용해 다시 64비트의 암호문을 만들어 내는 알고리즘이다. 블록 암호는 주로 단순한 함수를 반복적으로 적용해서 암호학적으로 강한 함수를 만드는 과정으로 개발된다. 이때 반복되는 함수를 라운드 함수라고 하고, 라운드 함수에 적용되는 키는 라운드키라고 한다. 라운드키 자체도 독립적으로 생성하는 것이 좋겠지만, 여러가지 관리상의 문제로 인해 보통은 키(비밀키)를 기반으로 라운드키를 발생시켜 사용한다. 이러한 것을 키 스케줄이라고 한다. 블록 암호는 라운드 함수를 적용하는 방법에 따라 대입-치환 네트워크 방식과 파이스텔 암호(Feistel Cipher)로 나눈다. 고급 암호화 표준 에서는 대입-치환 네트워크 방식을 쓰고 데이터 암호화 표준은 파이스텔 방식을 쓴다.
- 데이터 암호화 표준 알고리즘
- INPUT : 64비트의 평문과 키 스케줄을 거친 64비트의 키가 입력된다.
- OUTPUT : 64비트의 암호문이 나온다.
- 64비트의 평문이 16라운드를 거쳐 64비트의 암호문을 나오게 하는 방법
- 먼저 64비트의 평문이 첫 라운드를 거치기 전에 IP(initial permutation, 초기치환)를 거친다.
- IP를 거친뒤 평문은 첫 번째 라운드에 들어가게 되는데, 좌우 각각 32비트(Lo,Ro)로 나위어서 들어간다.
- 이제 오른쪽 32비트는 키 스케줄에 의해 나온 첫 번째 48비트 키와 F함수에 들어가고 F함수는 32비트를 내뱉는다.
- F함수에서 나온 32비트는 2번의 왼쪽 32비트와 XOR연산을 거치게 된다.
- 첫 라운드의 오른쪽 32비트는 다음 라운드의 왼쪽 32비트로 들어가고, XOR연산을 거친 32비트는 다음 라운드의 오른쪽 32비트로 들어가게 된다.
- 두 번째 라운드부터 16번째 라운드까지 첫 번째 라운드와 같은 방식으로 이루어진다.
- 마지막 라운드를 거친 뒤 IP의 역에 들어가게 되는데, 이때는 좌우가 바뀌어서 (R 16, L 16)로 들어간다.
- IP의 역을 거친 것이 64비트의 암호문이다.
F함수
F함수에는 오른쪽의 32비트 텍스트와 키 스케줄을 거친 키가 들어간다.
- 오른쪽 32비트는 E(expansion)를 거치게 되어 48비트가 된다.
- 이 48비트는 키(48비트)와 XOR연산을 하게 된다.
- XOR연산의 결과로 나온 48비트는 6비트씩 잘려서 8개의 S-box에 들어가게 된다.
- 각각의 6비트는 S-box를 거친 뒤 4비트가 되어서 나오게 된다.
- 4비트씩 8개가 모여 다시 32비트를 이루게 된다.
- 이 32비트는 P(permutation)를 거쳐서 F함수의 결과(32비트)를 내놓는다.
키 스케줄
사용자는 56비트의 키를 입력하는데 이것에 8비트의 패리티 비트(parity bits)가 포함되어 키 스케줄에는 모두 64비트의 키가 들어간다. 패리티 비트는 키 사이즈를 64에서 56비트로 줄여준다. 키 스케줄을 거친 뒤 16개의 48비트 키가 생성되는데 그 과정은 다음과 같다.
- 키 스케줄을 하기 전에 쉬프트 횟수를 정의하는데 1,2,9,16번째는 한번, 나머지는 2번씩이다. 이것으로 총 28번의 쉬프트가 이루어진다.
- 먼저 키는 PC1박스를 거치게 된다. PC1박스를 거친 후엔 두 부분(각각 28비트)으로 나뉘게 된다.
- 이제 각각의 두 부분은 위에서 정의한대로 1번째에는 한 번의 왼쪽 쉬프트를, 두 번째에는 한 번의 왼쪽 쉬프트를, 세 번째에는 2번의 왼쪽 쉬프트를.....16번째에는 1번의 왼쪽 쉬프트를 하게 된다.
- 첫 번째 키는 1번째 쉬프트를 했을 때 두 부분을 합쳐서 PC2박스를 통과시켜 나오는 48비트이다.
- 두 번째 키는 2번째 쉬프트를 한 후 첫 번째와 같이 두 부분을 합쳐 PC2박스를 통과시켜 나오는 48비트이다.
- 이런 식으로 16번째까지 모두 16개의 키가 생성되게 한다.
1990년대 들어 데이터 암호화 표준 암호의 해독의 가능성이 높아지고, 1998년을 기점으로 데이터 암호화 표준은 표준 기한이 만료됨에 따라, 미국 NIST(표준 기술 연구소)에서 1997년 9월에 키의 길이가 128비트 이상인 새로운 블록암호인 고급 암호화 표준을 공모하였다. 최종적으로 레인달(Rijndael, Rijmen&Daemen)이 고급 암호화 표준으로 채택되었다.
고급 암호화 표준
데이터 암호화 표준의 안전성에 대한 여러가지 공격 방법들이 발표되면서 미국의 NIST에서는 1998년에 차세대 블록 암호 알고리즘인 고급 암호화 표준을 공모하였다. 그 후 2년간의 심사 과정을 걸쳐 2000년 10월에 레인달이 고급 암호화 표준 알고리즘으로 선정되었으며, 2001년 11월 FIPS-197로 등록되었다. 처음에 개발된 레인달 알고리즘은 암호화에 사용하는 키의 길이와 입력 평문의 길이가 128비트, 196비트, 256비트 중 하나를 선택할 수 있었다. 그러나 FIPS-197에 등록된 알고리즘은 입력 평문의 길이를 128비트로 고정시키고, 사용하는 암호화 키의 길이만 128비트, 192비트, 256비트 중에서 선택할 수 있도록 정의하고 있다. 고급 암호화 표준은 지금까지 알려진 블록 암호 알고리즘에 대한 모든 공격 방법들에 대해 안전하도록 설계되었으며, 하드웨어나 소프트웨어 구현시 속도나 코드 소형화 면에서 효율적이므로 스마트 카드와 같은 응용에 적합하다는 장점이 있다.
고급 암호화 표준 암호 방식은 평문을 128비트 단위로 나누어 암호화, 복호화를 수행하며, 각각의 128비트를 4X4 행렬로 표현하여 연산을 수행한다. 4x4 행렬로 표현된 암호화, 복호화 과정의 중간 결과를 state라 하며, 행렬의 각 열의 32비트를 워드(word)라 한다. 고급 암호화 표준의 기본 연산은 바이트 단위로 수행되며, 각 바이트를 유한체 GF(28) 위의 다항식으로 표현하여 연산을 수행하게 된다. 고급 암호화 표준의 암,복호화 과정은 바이트 단위의 덧셈, 곱셈 연산으로 이루어져 있다. 고급 암호화 표준의 암호화, 복호화 과정에서의 바이트들의 덧셈 연산은 비트 단위 XOR을 의미한다. 바이트들의 곱셈 연산은 모드 8차 기약 다항식 상에서의 곱셈을 의미한다.[5]
각주
- ↑ blisstoner, 〈[1]〉, 《삼성 소프트웨어 맴버십》, 2019-02-06
- ↑ 초보개발자 깡냉스, 〈블록 암호 운용 방식(block cipher modes of operation)〉, 《티스토리》, 2018-09-10
- ↑ Mark&People, 〈블럭 암호 방식에 대해 이해하기(대칭키)〉, 《티스토리》, 2011-12-27
- ↑ 불곰, 〈블록 암호 운용 방식 (block cipher modes of operation〉, 《티스토리》, 2017-02-18
- ↑ sy kim, 〈(암호학)DES AES RSA 암호화 알고리즘〉, 《티스토리》, 2015-11-30
참고자료
- 불곰, 〈블록 암호 운용 방식 (block cipher modes of operation〉, 《티스토리》, 2017-02-18
- Mark&People, 〈블럭 암호 방식에 대해 이해하기(대칭키)〉, 《티스토리》, 2011-12-27
- blisstoner, 〈[2]〉, 《삼성 소프트웨어 맴버십》, 2019-02-06
- 초보개발자 깡냉스, 〈블록 암호 운용 방식(block cipher modes of operation)〉, 《티스토리》, 2018-09-10
- sy kim, 〈(암호학)DES AES RSA 암호화 알고리즘〉, 《티스토리》, 2015-11-30
같이 보기