"패딩"의 두 판 사이의 차이
(→PKCS7) |
잔글 |
||
(사용자 2명의 중간 판 10개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''패딩(padding) | + | '''패딩'''(padding)이란 [[블록암호]] 알고리즘에서 [[블록]]의 크기를 일정하게 맞추기 위해 빈 부분을 채워주는 것을 말한다. [[ECB]](Electronic Code Book) 및 [[CBC]](Cipher Block Chaining) 모드에서 [[AES]] 및 [[트리플 DES]](Triple DES)와 같은 [[블록암호]] 알고리즘은 입력 내용이 블록 크기의 정확한 배수(64비트 또는 128비트)가 되어야 한다. 원문의 크기가 16바이트(64비트 또는 128비트)의 배수가 아니라면 마지막 블록은 16바이트보다 작은 크기가 된다. 이 때 마지막 블록의 빈 부분을 채워주는 방식을 패딩이라고 한다. |
== 특징 == | == 특징 == | ||
− | 주어진 | + | 주어진 [[평문]]을 [[블록암호]]로 [[암호화]]하기 위해서는 평문을 우선 블록 크기의 배수로 만들어야 한다. 예를 들어 [[DES]]로 암호화를 한다면 평문은 <math>64 x n</math>비트이어야 할 것이다. 평문의 길이가 블록 크기의 배수가 아닌 경우, 블록 크기의 배수가 되게끔 패딩을 추가 해야 하는데 이럴 때 필요하다. 이러한 패딩을 하는 알고리즘은 PKCS5, PKCS7 등이 존재한다. |
+ | |||
+ | 패딩의 가장 중요한 원칙은 <math>P(M)</math> 으로부터 <math>M</math>을 복구할 수 있어야 한다는 점이다. 이 원칙이 지켜지지 않으면 패딩된 메시지로부터 원본 메시지를 찾을 수 없다.<ref>blisstoner, 〈[http://www.secmem.org/blog/2019/02/06/block-cipher/ 현대 암호 1: 블록 암호]〉, 2019-02-06</ref> | ||
== 기법 == | == 기법 == | ||
8번째 줄: | 10번째 줄: | ||
=== PKCS#5 === | === PKCS#5 === | ||
− | PKCS# | + | PKCS#5 패딩은 64비트(8바이트) 블록 크기를 사용하는 블록 암호에 대해서만 정의된다. 원문의 길이가 <math> L</math> 바이트면 마지막 블록은 <math> L</math> <math>mod</math> <math>8</math>의 크기를 갖는다. 그럼 패딩 크기는 <math> 8 - (L</math> <math>mod</math> <math>8)</math> 가 된다. PKCS#5는 단순히 패딩 크기의 값을 갖는 바이트를 크기만큼 반복한다. |
− | <table border="1" | + | <table border="1" > |
+ | <caption>패딩으로 채워지는 데이터</caption> | ||
<tr bgcolor="" style=font-weight:bold;"> | <tr bgcolor="" style=font-weight:bold;"> | ||
<td>8 -(L mod 8)<td>패딩 바이트</tr> | <td>8 -(L mod 8)<td>패딩 바이트</tr> | ||
28번째 줄: | 31번째 줄: | ||
=== PKCS#7 === | === PKCS#7 === | ||
PKCS#7은 갯수만 늘어났을 뿐 방식은 PKCS#5와 같으며 PKCS#7이 8바이트 사이즈를 가질 때 PKCS#5와 동일하다. PKCS#7에서는 블록 크기가 1에서 255까지 값을 가질 수 있다.(255는 한 바이트의 최대 값) 자바에서는 패딩 방식을 입력할 때 PKCS#5와 PKCS#7를 구분하지 않고 PKCS5Padding 이라고 입력한다. | PKCS#7은 갯수만 늘어났을 뿐 방식은 PKCS#5와 같으며 PKCS#7이 8바이트 사이즈를 가질 때 PKCS#5와 동일하다. PKCS#7에서는 블록 크기가 1에서 255까지 값을 가질 수 있다.(255는 한 바이트의 최대 값) 자바에서는 패딩 방식을 입력할 때 PKCS#5와 PKCS#7를 구분하지 않고 PKCS5Padding 이라고 입력한다. | ||
+ | |||
+ | === 비트 패딩 === | ||
+ | 비트 패딩은 크기와 상관없이 메시지에 적용할 수 있다. 메시지에는 단일 세트(1) 비트가 추기돠고, 필요한 개수만큼 재설정(0) 비트가 추가된다. 추가된 재설정(0) 비트 수는 메시지를 확장해야 하는 블록 경게에 따라 달라진다. 이 방법을 사용하면 비트 수가 길고 반드시 바이트 수가 아닌 메시지를 채울 수 있다. 예를 들어, 32비트 블록을 채우기 위해 9비트로 채워진 23비트 메시지라 가정한다. | ||
+ | |||
+ | ... | 1011 1001 1101 0100 0010 011 <b>1 0000 0000</b> | | ||
+ | |||
+ | 이 패딩은 [[MD5]] 및 [[SHA]]를 포함한 많은 [[해시]] 함수에 사용되는 2단계 패딩 체계의 첫 번째 단계이다. | ||
+ | |||
+ | === 바이트 패딩 === | ||
+ | 바이트 패딩은 정수 바이트로 인코딩 될 수 있는 메시지에 적용될 수 있다. | ||
+ | |||
+ | === ANSI X9.23 === | ||
+ | ANSI X9.23에서는 1에서 8바이트 사이는 항상 패딩으로 추가된다. 블록은 랜덤 바이트로 패딩되며, 블록의 마지막 바이트는 추가된 바이트 수로 설정된다. | ||
+ | |||
+ | ... | DD DD DD DD DD DD DD DD | DD DD DD DD <b>00 00 00 04</b> | | ||
+ | === ISO 10126 === | ||
+ | ISO 10126은 패딩이 랜덤 바이트로 마지막 블록의 끝에서 수행되어야 하며 패딩 경계는 마지막 바이트로 지정되어야 한다. | ||
+ | |||
+ | ... | DD DD DD DD DD DD DD DD | DD DD DD DD <b>81 A6 23 04</b> | | ||
+ | |||
+ | === 제로 패딩 === | ||
+ | 제로 패딩은 패딩해야 하는 바이트는 모두 0으로 패딩되어 있다. 제로 패딩 체계는 ISO/IEC 101181-1 및 ISO/IEC 9797-1의 패딩 방법 1로 해시 및 MAC에 대해 규정되어 있지만 암호화를 위해 표준화되지 않는다. | ||
+ | |||
+ | ... | DD DD DD DD DD DD DD DD | DD DD DD DD <b>00 00 00 00</b> | | ||
+ | |||
+ | 제로 패딩은 원본 파일이 하나 이상의 0 바이트로 끝나는 경우 되돌릴 수 없으므로 일반 텍스트 데이터 바이트와 패딩 바이트를 구별할 수 없다. 메시지 길이가 대역 외에서 파생될 수 있는 경우에 사용할 수 있다. 보통 null 문자가 백스페이스로 벗겨질 수 있기 때문에 이진 인코딩 문자열에 종종 적용된다. 제로 패딩(zero padding)은 "null padding" 또는 "zero byte padding"이라고도 한다. 일부 구현에서는 일반 텍스트가 블록 크기로 이미 분할된 경우 0바이트의 추가 블록을 추가할 수 있다. | ||
+ | |||
+ | {{각주}} | ||
+ | |||
+ | == 참고자료 == | ||
+ | * Blisstoner, 〈[http://www.secmem.org/blog/2019/02/06/block-cipher/ 현대 암호 1: 블록 암호]〉, 2019-02-06 | ||
+ | * 〈[https://www.di-mgt.com.au/cryptopad.html#whatispadding Using Padding in Encryption]〉, 디아이 관리서비스, 2016-03-30 | ||
+ | * happinessoncode, 〈[http://happinessoncode.com/2019/04/06/java-cipher-algorithm-mode-padding/ Java Cipher - 알고리즘, 운용 모드, 패딩의 이해]〉, 2019-04-06 | ||
+ | * 늦둥이해커, 〈[https://m.blog.naver.com/PostView.nhn?blogId=kimsumin75&logNo=20052758168&proxyReferer=https%3A%2F%2Fwww.google.com%2F 블록 암호의 패딩]〉, 2008-07-17 | ||
+ | * 진리와자유, 〈[https://okky.kr/article/490205 PKCS#5 패딩과 PKCS#7 패딩의 차이점]〉, 2018-08-06 | ||
+ | * 〈[https://en.wikipedia.org/wiki/Padding_(cryptography)#ANSI_X.923 Padding(crptography)]〉, 《위키피디아》 | ||
+ | |||
+ | == 같이 보기 == | ||
+ | * [[블록암호]] | ||
+ | * [[DES]] | ||
+ | * [[AES]] | ||
+ | * [[트리플 DES]] | ||
+ | |||
+ | {{암호 알고리즘|검토 필요}} |
2020년 1월 13일 (월) 02:39 기준 최신판
패딩(padding)이란 블록암호 알고리즘에서 블록의 크기를 일정하게 맞추기 위해 빈 부분을 채워주는 것을 말한다. ECB(Electronic Code Book) 및 CBC(Cipher Block Chaining) 모드에서 AES 및 트리플 DES(Triple DES)와 같은 블록암호 알고리즘은 입력 내용이 블록 크기의 정확한 배수(64비트 또는 128비트)가 되어야 한다. 원문의 크기가 16바이트(64비트 또는 128비트)의 배수가 아니라면 마지막 블록은 16바이트보다 작은 크기가 된다. 이 때 마지막 블록의 빈 부분을 채워주는 방식을 패딩이라고 한다.
목차
특징[편집]
주어진 평문을 블록암호로 암호화하기 위해서는 평문을 우선 블록 크기의 배수로 만들어야 한다. 예를 들어 DES로 암호화를 한다면 평문은 비트이어야 할 것이다. 평문의 길이가 블록 크기의 배수가 아닌 경우, 블록 크기의 배수가 되게끔 패딩을 추가 해야 하는데 이럴 때 필요하다. 이러한 패딩을 하는 알고리즘은 PKCS5, PKCS7 등이 존재한다.
패딩의 가장 중요한 원칙은 으로부터 을 복구할 수 있어야 한다는 점이다. 이 원칙이 지켜지지 않으면 패딩된 메시지로부터 원본 메시지를 찾을 수 없다.[1]
기법[편집]
패딩기법은 블럭의 나머지 부분을 바이트(otect) 수로 채운다. 예를 들어 128비트의 블록에서, 만약 블록에 남는 다섯 개의 남은 평문 바이트가 있다면, 11값을 가진 11 바이트가 블록에 패딩된다. 블록에 채워진 데이터는 16바이트(128비트)로 나누어지게 된다. 이 방법은 패딩이 복호화 뒤에 명백하게 제거되도록 하고, 평문의 원래 크기가 다시 저장 되도록 한다. 추가적으로 64비트의 블론인 경우는 다섯 개의 남은 평문이 있다면, 3의 값을 가진 3바이트 블록에 패딩된다. 블록에 채워진 데이터는 8바이트(64비트)로 나누어지게 된다. 만약 평문이 블록(64비트 또는 128비트 외 기타)으로 나누어지면, 패딩을 추가하지 않아도 되며, 암호화를 수행 할때는 패딩이 항상 추가 된다.
PKCS#5[편집]
PKCS#5 패딩은 64비트(8바이트) 블록 크기를 사용하는 블록 암호에 대해서만 정의된다. 원문의 길이가 바이트면 마지막 블록은 의 크기를 갖는다. 그럼 패딩 크기는 가 된다. PKCS#5는 단순히 패딩 크기의 값을 갖는 바이트를 크기만큼 반복한다.
8 -(L mod 8) | 패딩 바이트 |
1 | 01 |
2 | 02 02 |
3 | 03 03 03 |
4 | 04 04 04 04 |
.... | .... |
8 | 08 08 08 08 08 08 08 08 |
PKCS#7[편집]
PKCS#7은 갯수만 늘어났을 뿐 방식은 PKCS#5와 같으며 PKCS#7이 8바이트 사이즈를 가질 때 PKCS#5와 동일하다. PKCS#7에서는 블록 크기가 1에서 255까지 값을 가질 수 있다.(255는 한 바이트의 최대 값) 자바에서는 패딩 방식을 입력할 때 PKCS#5와 PKCS#7를 구분하지 않고 PKCS5Padding 이라고 입력한다.
비트 패딩[편집]
비트 패딩은 크기와 상관없이 메시지에 적용할 수 있다. 메시지에는 단일 세트(1) 비트가 추기돠고, 필요한 개수만큼 재설정(0) 비트가 추가된다. 추가된 재설정(0) 비트 수는 메시지를 확장해야 하는 블록 경게에 따라 달라진다. 이 방법을 사용하면 비트 수가 길고 반드시 바이트 수가 아닌 메시지를 채울 수 있다. 예를 들어, 32비트 블록을 채우기 위해 9비트로 채워진 23비트 메시지라 가정한다.
... | 1011 1001 1101 0100 0010 011 1 0000 0000 |
이 패딩은 MD5 및 SHA를 포함한 많은 해시 함수에 사용되는 2단계 패딩 체계의 첫 번째 단계이다.
바이트 패딩[편집]
바이트 패딩은 정수 바이트로 인코딩 될 수 있는 메시지에 적용될 수 있다.
ANSI X9.23[편집]
ANSI X9.23에서는 1에서 8바이트 사이는 항상 패딩으로 추가된다. 블록은 랜덤 바이트로 패딩되며, 블록의 마지막 바이트는 추가된 바이트 수로 설정된다.
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 04 |
ISO 10126[편집]
ISO 10126은 패딩이 랜덤 바이트로 마지막 블록의 끝에서 수행되어야 하며 패딩 경계는 마지막 바이트로 지정되어야 한다.
... | DD DD DD DD DD DD DD DD | DD DD DD DD 81 A6 23 04 |
제로 패딩[편집]
제로 패딩은 패딩해야 하는 바이트는 모두 0으로 패딩되어 있다. 제로 패딩 체계는 ISO/IEC 101181-1 및 ISO/IEC 9797-1의 패딩 방법 1로 해시 및 MAC에 대해 규정되어 있지만 암호화를 위해 표준화되지 않는다.
... | DD DD DD DD DD DD DD DD | DD DD DD DD 00 00 00 00 |
제로 패딩은 원본 파일이 하나 이상의 0 바이트로 끝나는 경우 되돌릴 수 없으므로 일반 텍스트 데이터 바이트와 패딩 바이트를 구별할 수 없다. 메시지 길이가 대역 외에서 파생될 수 있는 경우에 사용할 수 있다. 보통 null 문자가 백스페이스로 벗겨질 수 있기 때문에 이진 인코딩 문자열에 종종 적용된다. 제로 패딩(zero padding)은 "null padding" 또는 "zero byte padding"이라고도 한다. 일부 구현에서는 일반 텍스트가 블록 크기로 이미 분할된 경우 0바이트의 추가 블록을 추가할 수 있다.
각주[편집]
- ↑ blisstoner, 〈현대 암호 1: 블록 암호〉, 2019-02-06
참고자료[편집]
- Blisstoner, 〈현대 암호 1: 블록 암호〉, 2019-02-06
- 〈Using Padding in Encryption〉, 디아이 관리서비스, 2016-03-30
- happinessoncode, 〈Java Cipher - 알고리즘, 운용 모드, 패딩의 이해〉, 2019-04-06
- 늦둥이해커, 〈블록 암호의 패딩〉, 2008-07-17
- 진리와자유, 〈PKCS#5 패딩과 PKCS#7 패딩의 차이점〉, 2018-08-06
- 〈Padding(crptography)〉, 《위키피디아》
같이 보기[편집]