최신판 |
당신의 편집 |
1번째 줄: |
1번째 줄: |
− | '''패딩'''(padding)이란 [[블록암호]] 알고리즘에서 [[블록]]의 크기를 일정하게 맞추기 위해 빈 부분을 채워주는 것을 말한다. [[ECB]](Electronic Code Book) 및 [[CBC]](Cipher Block Chaining) 모드에서 [[AES]] 및 [[트리플 DES]](Triple DES)와 같은 [[블록암호]] 알고리즘은 입력 내용이 블록 크기의 정확한 배수(64비트 또는 128비트)가 되어야 한다. 원문의 크기가 16바이트(64비트 또는 128비트)의 배수가 아니라면 마지막 블록은 16바이트보다 작은 크기가 된다. 이 때 마지막 블록의 빈 부분을 채워주는 방식을 패딩이라고 한다. | + | '''패딩(padding)'''이란 ECB(Electronic Code Book) 및 CBC(Cipher Block Chaining) 모드에서 AES 및 Triple DES와 같은 블록 암호 알고리즘은 입력 내용이 블록 크기의 정확한 배수(64비트 또는 128비트)가 되어야 한다. 원문의 크기가 16바이트(64비트 또는 128비트)의 배수가 아니라면 마지막 블록은 16바이트보다 작은 크기가 된다. 이 때 마지막 블록의 빈 부분을 채워주는 방식을 패딩이라고 한다. |
| | | |
| == 특징 == | | == 특징 == |
− | 주어진 [[평문]]을 [[블록암호]]로 [[암호화]]하기 위해서는 평문을 우선 블록 크기의 배수로 만들어야 한다. 예를 들어 [[DES]]로 암호화를 한다면 평문은 <math>64 x n</math>비트이어야 할 것이다. 평문의 길이가 블록 크기의 배수가 아닌 경우, 블록 크기의 배수가 되게끔 패딩을 추가 해야 하는데 이럴 때 필요하다. 이러한 패딩을 하는 알고리즘은 PKCS5, PKCS7 등이 존재한다. | + | 주어진 평문을 블록 암호로 암호화하기 위새어는 평문을 우선 블록 크기의 배수로 만들어야 한다. 예를 들어 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>
| |
| | | |
| == 기법 == | | == 기법 == |
10번째 줄: |
8번째 줄: |
| | | |
| === PKCS#5 === | | === PKCS#5 === |
− | 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는 단순히 패딩 크기의 값을 갖는 바이트를 크기만큼 반복한다. | + | PKCS#5는 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> | | <caption>패딩으로 채워지는 데이터</caption> |
32번째 줄: |
30번째 줄: |
| 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 | | * Blisstoner, 〈[http://www.secmem.org/blog/2019/02/06/block-cipher/ 현대 암호 1: 블록 암호]〉, 2019-02-06 |
66번째 줄: |
38번째 줄: |
| * 늦둥이해커, 〈[https://m.blog.naver.com/PostView.nhn?blogId=kimsumin75&logNo=20052758168&proxyReferer=https%3A%2F%2Fwww.google.com%2F 블록 암호의 패딩]〉, 2008-07-17 | | * 늦둥이해커, 〈[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://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]]
| |
− |
| |
− | {{암호 알고리즘|검토 필요}}
| |