http://happinessoncode.com/2019/04/06/java-cipher-algorithm-mode-padding/
자바에서는 대칭키 알고리즘을 사용하여 데이터를 암호화/복호화할 때 javax.crypto.Cipher 클래스를 사용한다. 이 클래스의 인스턴스는 정적 메서드인 Cipher.getInstance()를 호출하여 가져올 수 있는데, 호출시 사용할 알고리즘, 운용 모드, 패딩 방식을 인자로 넘겨줘야 한다. 대칭키 암호화에서 알고리즘, 운용 모드, 패딩은 무엇이고 어떤 역할을 하는지 알아보자.
알고리즘 등에 대해 얘기하기전에 암호문의 성질에 대해서 알아보자. 안전한 암호문은 공격자가 이를 보고 원본 메시지나 암호화에 사용된 키를 유추할 수 없어야한다. 이러한 성질을 혼돈과 확산이라고 하며, 각각 다음과 같은 의미를 갖는다.
다르게 말하면 혼돈이란 키의 비트 하나만 바꿔도 암호문 전체가 바뀌도록 하는 성질이다. 안전한 암호는 공격자가 아무리 많은 평문-암호문 쌍을 알고 있어도 그 속에서 키의 패턴을 발견할 수 없어야 한다. 마찬가지로 확산은 원문의 비트를 하나만 바꿔도 암호문 전체가 바뀌도록 하는 성질이다. 서로 다른 원문이 비슷한 내용을 담고 있더라도 각각의 암호문은 완전히 다른 값을 가져야 한다.
암호 알고리즘에서는 혼돈과 확산을 달성하기 위해 Substitution과 Permutation을 이용한다. Substitution은 문자를 다른 문자로 바꾸는 것이고, Permutation은 문자들의 순서를 바꾸는 것이다. Substitution과 Permutation을 한번 수행하는 것이 암호 알고리즘의 기본 수행 단위이다. 암호문은 이를 여러번 수행할 수록 안전하다. Substitution-Permutation을 연속하여 수행하도록 이어 놓은 것을 SPN(Substitution Permutation Network)이라고 한다. SPN에서 한 번의 Substitution-Permutation 수행을 라운드 또는 레이어라고 한다. 아래 그림은 3라운드로 이루어진 SPN이다.(이미지 출처: Wikipedia)
Substitution Permutation Network

SPN을 이용하는 대표적인 암호 알고리즘으로 AES가 있다. SPN을 이용하는 알고리즘은 보통 데이터를 블록 단위로 처리한다. AES의 경우 블록의 크기는 128비트(16바이트)이다. 그런데 모든 데이터가 16바이트 크기를 가질 수 없으므로, 데이터를 블록 단위로 나누어 처리하고 합치는 과정이 필요하다.
데이터를 블록으로 나누어 처리하고 합치는 것, 그것이 암호화에서 운용 모드가 하는 역할이다. 대표적인 운용 모드로는 ECB(Electronic Code Book)와 CBC(Cipher Block Chaining)가 있다.
먼저 ECB부터 알아보자. ECB는 단순히 블록 단위로 처리한 결과를 이어붙이는 방법이다. 아래 그림은 ECB 처리 방식을 보여준다.(이미지 출처: Wikipedia)
Electronic Code Book

ECB는 단순하지만 같은 값을 갖는 원문 블록은 같은 암호 블록을 출력하기 때문에 원문의 패턴이 그대로 드러난다. 이는 암호문에서 원문을 유추할 수 있음을 의미하기 때문에 ECB는 확산의 성질을 달성하지 못한다고 볼 수 있다. 아래는 원본 이미지와 ECB로 암호화한 이미지이다. 원본의 패턴이 드러나는 것을 볼 수 있다.(이미지 출처: Wikipedia)
원본