패딩 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
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>
 
 
<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>
32번째 줄: 29번째 줄:
 
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번째 줄: 37번째 줄:
 
* 늦둥이해커, 〈[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]]
 
 
{{암호 알고리즘|검토 필요}}
 

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)