Java

[Java] 암호 알고리즘 / 운용 모드 / Padding

예은파파 2020. 11. 28. 15:50

 

암호 알고리즘

  • 자바에서는 대칭키 알고리즘을 사용하여 데이터를 암호화/복호화 시에 javax.crypto.Cipher 클래스를 사용한다, 
    클래스의 인스턴스는 정적 메서드인 Cipher.getInstance() 를 호출하여 생성할 수 있는데, 이 때 호출 시 사용할 알고리즘, 운용 모드, 패딩 방식을 인자 값으로 넘겨줘야 한다.

 

  • 혼돈과 확산을 달성하기 위해 Substitution 과 Permutation을 이용한다. Subsititution은 문자를 다른 문자로 바꾸는 것이고, Permutation은 문자들의 순서를 바꾸는 것이다. Substituition과 Permutation을 한번 수행하는 것이 암호 알고리즘의 기본 수행 단위 이다. 암호문은 이를 여러번 수행할수록 안전하다. Substitution-Permutation을 연속으로 수행하도록 이어 놓은 것을 SPN(Subsititution Permutation Network)이라고 한다.

 

  • SPN을 이용하는 대표적인 암호 알고리즘으로 AES가 있다. SPN을 이용하는 알고리즘은 보통 데이터를 블록 단위로 처리한다. AES의 경우 블록의 크기는 128비트(16바이트)이다. 그런데 모든 데이터가 16바이트 크기를 가질 수 없으므로, 데이터를 블록 단위로 나누어 처리하고 합치는 과정이 필요하다.

 

운용 모드

  • 데이터를 블록으로 나누어 처리하고 합치는 것, 이것이 암호화해서 운용 모드가 하는 역할이다. 대표적인 운용 모드로는 ECB(Electronic Code Book) 와 CBC(Cipher Block Chaining)가 있다.

 

- ECB(Electronic Code Book) 

Electronic Code Book

ECB는 단순히 블록 단위로 처리한 결과를 이어 붙이는 방식으로 같은 값을 갖는 원문 블록은 같은 암호 블록을 출력하기 때문에 원문의 패턴이 그대로 드러난다, 이는 암호문에서 원문을 유추할 수 있음을 의미하기 때문에 ECB는 확산의 성질을 달성하지 못한다고 볼 수 있다.

 

 

- CBC(Cipher Block Chaining)

Cipher Block Chaining

CBC는 원문 블록을 그대로 암호화하지 않고, 직전에 암호화된 블록과 XOR 연산을 한 다음에 암호화를 수행한다. 그렇기 때문에 같은 내용을 갖는 원문 블록이라도 전혀 다른 암호문을 갖게 된다. 그런데 첫번째 블록은 직전 암호문이 없으므로 XOR 연산 대상이 없다. 이를 위해 CBC모드는 초기화 백터(Initialization Vector)를 입력 받는다. 초기화 벡터는 원문 블록을 XOR하는데 쓰이기 때문에 당연히 블록 사이즈와 동일한 크기여야 한다.

 

CBC모드는 직전 블록이 다음 블록의 암호화에 관여하므로 일부 블록만 복호화하고 싶어도 전체를 복호화해야 한다.

반면 ECB는 전체를 복호화 하지 않고 일부만 복호화하는 것이 가능하다.

 

 

패딩(Padding)

  • AES와 같은 16바이트 크기의 블록 암호 알고리즘을 사용하는데 원문의 크기가 16바이트의 배수가 아닐 경우, 마지막 블록은 16바이트보다 작은 크기가 된다. 이 때 마지막 블록의 빈 부분을 채워주는 방식을 패딩이라고 한다. 가장 유명한 패딩 방식인 PKCS5 / PKCS7이 있다.

 

  • 특정 암호화 알고리즘에서는(AES,DES 등) 입력문자열이 특정 바이트의 배수가 되어야 하는 상황에 Padding을 사용.

블럭사이즈가 8바이트로 설정해 놓은 상태에서 5바이트의 평문이 입력될 경우,

[AA A1 A2 A3 A4 _ _ _] 이런식으로 블럭이 채워지게 되는데, 블럭사이즈인 8바이트 3바이트가 모자란 상태 패딩을 수행하게되면 [AA A1 A2 A3 A4 03 03 03] 모자란 바이트의 수로 채워주게 된다. 이러한 방식을 PKCS 방식이라고 한다.

 

 

 

 

참고 링크

 

http://happinessoncode.com/2019/04/06/java-cipher-algorithm-mode-padding/

 

Java Cipher - 알고리즘, 운용 모드, 패딩의 이해

자바에서는 대칭키 알고리즘을 사용하여 데이터를 암호화/복호화할 때 javax.crypto.Cipher 클래스를 사용한다. 이 클래스의 인스턴스는 정적 메서드인 Cipher.getInstance()를 호출하여 가져올 수 있는데,

happinessoncode.com