본문 바로가기

Computer Science/security

[정보보호] 블록암호 기법

블록 암호는 고정된 n-bit 블록을 n-bit 블록으로 변환시키는 것입니다.
따라서, 어떤 길이의 평문을 암호화 시킬 때는 평문을 특정한 길이로 분할하여야 합니다.
만약에 64bit 블록으로 암호화 하는데 평문의 길이가 64bit 가 되지 않거나 ... 마지막 블록이 64bit 되지 않으면 어떻게 해야 할까요?
이럴 때는 패딩(padding) 기법을 써야 합니다. 즉, 64bit 블록이 되도록 모자란 부분을 채워놓는 것이죠.
(패딩 방법에도 여러가지 방법이 있습니다. 추후 설명)
블록 암호는 패딩과 같은 문제도 있고 블록으로 나눠서 처리를 하기 때문에 블록들을 어떠한 방식으로 사용할 것인가에 대한 방식도 규정을 해야 합니다.
즉, 블록 암호는 암호 알고리즘만으로는 ... 완성이 되지 않습니다.
암호 알고리즘은 64bit 블록 단위에만 적용이 됩니다. 블록들 사이의 관계는 알고리즘은 아니라는 것이죠.
물론 블록의 크기는 암호방식에 따라 다릅니다.
블록 암호의 사용 방식은 다음 4가지가 주로 쓰입니다.
- ECB(Electronic CodeBook) : 블록 암호에 사용
- CBC(Cipher-Block Chaining) : 블록 암호에 사용
- CFB(Cipher FeedBack) : 스트림 암호에 사용
- OFB(Output FeedBack) : 스트림 암호에 사용
이 중에서도 특히 CBC 와 CFB 가 범용적으로 쓰입니다.
좀 더 상세하게 각각의 방식을 살펴보겠습니다.
[ECB]
드뎌 .. 모두가 좋아하는 그림이 나왔습니다.~~~
아래 그림을 보세요.
[그림 1] ECB
흠 .. 맞습니다. 블록들 사이의 연관관계가 없습니다.
그냥 하나의 블록씩 암호화 시켜나가는게 ECB 방식입니다.
실전에서는 거의 쓰지 않는 방식입니다.
얼핏 생각하면 암호화 했는데 ... 머가 어때서 안쓰느냐라고 생각하실지 모르겠습니다.
하지만, 정당한 권한이 없는 사람이 비밀키를 획득하였고 ... 암호문의 일부를 어떻게 구했다고 칩시다.
그러면 복호화 할 수 있나요?
예 .. 이 방식에서는 복호화할 수 있습니다. 블록들 사이의 연관관계가 없기 때문에 블록단위로 암호를 해독할 수 있는 것입니다.
물론 복호화된 평문이 ... 불완전하긴 하지만.. 그건 암호문을 일부만 취득했기 때문이니 어쩔 수 없는거죠.
또 암호문의 한 블록에서 오류가 발생하면 대응되는 평문 블록에서만 에러가 발생합니다.
ECB 방식에서는 또 하나 중요한 단점이 있습니다.
평문이 동일하면 암호문이 동일합니다.
(동일한 키로 여러 블록을 암호화하기 때문)
즉, 평문에 나타난 패턴이 암호문 블록의 패턴에 그대로 나타난다는 것이죠.
아직 ... 암호문의 공격방법에 대해서는 잘 모르더라도, 뭐 직감적으로 패턴이 그대로 나타난다면... 해독될 가능성이 더 높아진다라고 생각이 될겁니다.
그래서 난수발생같은 특수한 경우에만 사용하고 그외에는 사용하지 않습니다.
[CBC]
아래 그림을 보세요.
ECB와 어떤점이 달라졌나요?
 
[그림 2] CBC - Encryption
처음에 평문이 그냥 암호화 되는 것이 아니고 초기값(Initial Vector) 에 의해 XOR 연산을 수행한 후에 암호화가 되네요 ...
암호화된 블록이 다음 블록의 입력값으로 다시 사용되네요. 평문 블록과 XOR 연산을 수행하기 위해서요.
계속 이런식으로 반복하여 암호화를 수행하게 됩니다.
이렇게 현재의 블록이 다음의 블록에 영향을 미치므로 블록의 순서가 바뀌면 복호화가 제대로 되지 않습니다.
암호문 한 블록에서 에러가 발생하면 그에 해당하는 블록과 그 다음 블록에서의 평문에서 에러가 발생합니다.
즉, 만약 암호문 8번째 블록에서만 에러가 발생했다면 8, 9번째 평문 블록은 에러가 발생하고 암호문 10번째 블록부터는 정상적으로 복호화할 수 있습니다.
이 방식의 가장 큰 특징은 평문의 특정 한 블록이 변하면 그 다음부터 나오는 모든 암호문 블록은 바뀌게 됩니다.
이것을 "암호학적 특성이 우수하다"라고 말을 합니다.
초기값은 비밀일 필요는 없지만, 비밀로 유지하는 것이 좋습니다.
오늘날 대부분의 블록 암호 시스템은 CBC 방식을 주로 이용합니다.
좋기 때문이죠 ^^
아래에 CBC 방식을 이용한 복호화 과정을 보여주고 있습니다.
 
[그림 3] CBC - Decryption
[CFB]
CBC 방식과 동작 방식은 거의 비슷합니다.
CBC 는 고정된 크기의 블록을 다루었다면, CFB 는 r-bit 단위로 암호화 할 수 있습니다.
즉, 스트림 암호처럼 처리할 수 있는 방식입니다.
일단 [그림 4]를 보시기 바랍니다.
암호화된 값이 다음 단위에 영향을 미치는 것은 것은 CBC 와 별반 차이가 없습니다.
너무 추상화되어 있다고 보시면 되구요 .....
다시 [그림 6]을 봐 주시기 바랍니다. (encryption 부분만 보시길 ....)
[그림 4] CFB - Encryption
 
[그림 5] CFB - Decryption
아래는 [그림 4] 와 [그림 5] 를 좀 더 상세하게 보여줍니다.
[그림 6] CFB : r-bit Shift 를 좀 더 알기 쉽게 도식화
원래의 평문을 3bit 씩 암호화 한다고 생각해 봅시다.
즉, r=3 인거죠.
초기값(IV)과 key 값이 E(Encryption 함수)를 통과하여 출력값 O 를 내보냅니다.
이때의 출력값은 블록단위입니다.(64bit <- 암호방식에 따라 달라질 수 있는값)
평문 x 가 3bit 씩 출력값 O 의 처음 3bit 와 XOR 연산을 하게 됩니다.
이 때 나온 3bit 의 값이 암호화된 3bit 입니다.
이제 평문 x 의 그 다음 3bit 를 암호화 해야 합니다.
이때 출력값 O 를 뽑아내기 위한 입력값은 직전에 암호화된 3bit 를 기존 초기값에 덧붙이게 됩니다.
그리고 전체적으로 3bit 좌로 Shift 시킵니다. (Shift Register 라고 얘기함)
그렇게 해서 처음 암호화 했던 방식대로 계속 진행되게 됩니다.
아마 그림을 보시면 이해가 더 쉬울것 같네요.
즉, CBC 는 정해진 블록단위로만 암호화를 수행하지만 ... CFB 는 암호화 할 수 있는 단위를 정할 수 있다는 것입니다.
OFB 를 살펴볼 텐데요 ... CFB 를 이해하면 내용은 똑같습니다.
단지 입력값을 어디서 뽑아내는지 위치만 틀릴 뿐입니다.
[OFB]
CFB 와 다른 점이 거의 없습니다.
[그림 7] 과 [그림 9] 를 살펴보시면 ....
출력값 O 를 .... 입력값으로 다시 사용합니다.
출력값 O 는 블록단위(64bit) 이므로 입력값으로 그냥 출력값 O 를 쓰게 됩니다.
(r-bit Shfit 없음)
[그림 7] OFB - Encryption
 
[그림 8] OFB - Decryption
 
[그림 9] OFB : r-bit Shift 가 없고 출력값을 그대로 입력으로 넣는 것을 도식화
 
에구 .. 이렇게 ... 4가지 방식을 살펴봤는데요 .... 흠 ...
사실 설명이 장황해서 ... 그림으로 보면 더 잘 이해하실거 같네요 ^^;
일단은 ... CBC 하나만이라도 꼭 이해하시고 넘어가세요.
다음에는 .. DES 알고리즘을 설명하도록 하겠습니다.
참고로,
여기에 쓴 그림들은 ... wikipedia 와 제가 참고자료에 올려놓은 Handbook of Applied Croptography 책에서 따왔습니다