블록 암호화에서의 운영 모드 및 패딩
암호화 할때, 운영 모드를 어떤 것을 할지 고민 일때 참고용.
ex> AES/CBC/PKCS7Padding
1. ECB (Electronic Code Block) Mode
- 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조이다.
- 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. (Brute-Force Arttack, Dictionary Attack)
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding을 해야한다.
- error propagation : 각 블록이 독립적으로 동작하므로 한블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다. 해당 블록까지 에러 전파.
2. CBC(Cipher Block Chaining) Mode
- 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용된다.
- 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용된다. 이 때, IV는 제 2의 키가 될수 있다.
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 Padding을 해야만 한다.
- 암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다.
- error propagation : 깨진 암호문의 해당블록과 다음블록의 평문까지 영향을 미치게 됩니다. 두번째 복호화의 Ciphertext가 깨졌을 때 참조.
3. CFB(Cipher FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다(패딩이 필요 없다)
- 최초의 키생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있다.
- 스트림의 기본단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 CFB8~CFB128로 쓰인다.
- 암호화, 복호화 모두 암호화로만 처리할 수 있다.
- CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있다.
- error propagation : CBC모드와 마찬가지로 한 암호문블럭의 에러는 해당평문블록과 다음 평문블록, 이렇게 총 2개의 블록에 전파된다.
4. OFB(Output FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다.(패딩이 필요없다)
- 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나온다. (복호화시에 암호화)
- 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있다.
- 스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰인다.
- error propagation : 해당블록까지만~ 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitized analog신호에 많이 사용된다.
5. CTR (CounTeR) Mode
- 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키스트림을 만든다. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 된다.
- CTR모드는 OFB와 같은 스트림 암호의 일종이다.
- CTR모드의 암복호화는 완전히 같은 구조가 되므로 구현이 간단하다.(OFB와 같은 스트림 암호의 특징)
- CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수있다.(비표와 블록번호로부터 카운터를 구할 수 있기때문에)
- 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미한다.(병렬처리 가능)
- error propagation : 각 블록이 병렬처리 되므로 같은 블록내에서만 이루어짐.
- PKCS#5
암호 블록 사이즈가 8바이트에 맞춰져있다.
8바이트의 배수로 인풋을 맞춰줘야하는데 패딩에 들어가는 문자는 패딩할 갯수가 들어간다.
예시)
AA 07 07 07 07 07 07 07 : 1바이트 데이터 + 7바이트 패딩
AA BB 06 06 06 06 06 06 : 2바이트 데이터 + 6바이트 패딩
AA BB CC 05 05 05 05 05 : 3바이트 데이터 + 5바이트 패딩
주의 : 데이터가 8바이트인 경우에는 패딩이 필요 없어 보여도, 08을 8번 패딩한다.
AA A9 A8 A7 A6 A5 A4 A3 08 08 08 08 08 08 08 08 : 8바이트 데이터 + 8바이트 패딩
- PKCS#7
패딩할 숫자만큼 패딩 값을 채워넣어서 붙여주는 것은 PKCS#5와 동일.
따라서, 8바이트의 암호화 블럭 크기인 경우 PKCS#5 = PKCS#7이다.
하지만 현대의 암호화에서는 당연히 더 긴 암호화 블럭을 사용하기 때문에 달라진다.
AES256의 예를 들면, 256bit의 키를 사용하게 되고, 블럭 사이즈는 128bit이므로 32바이트의 키와 16바이트의 암호화 블럭을 사용하게 된다.
이 상황에서 PKCS#7은 패딩이 최대 16개까지 가능하다.
(8바이트인 경우 08을 패딩 8번 하듯이 10으로 패딩 16번을 수행한다.)
PKCS#7은 최대 가능한 패딩은 FF이므로, 255개가 된다.
두 개의 차이라 하면, PKCS#5는 8바이트 고정길이, PKCS#7은 1~255바이트의 가변길이이다.
'Tech develop > 인증' 카테고리의 다른 글
HMAC(Hash-based Message Authentication Code) (1) | 2021.07.29 |
---|---|
RSA 암호 알고리즘이란? (0) | 2021.07.29 |
[Android] WhiteBox (0) | 2021.07.29 |
Android KeyStore 와 Keystore 의 차이 (0) | 2021.07.29 |