복호화가 가능한 암호화 방식
대표적인 대칭키 양방향 암호화 방식
평문을 고정된 크기의 블록으로 잘라서 한 블록씩 암호화 하는방식
AES의 블록크기는 16바이트로 고정되어있다.
예를들어, 평문의 길이가 32바이트라면 2개의 암호화블록으로 구성된 암호가 생성된다.
만약, 평문의 길이가 16의 배수가 아니라면 마지막 블록은 빈 자리를 채워넣어 16바이트로 맞춘다.
이것을 패딩 이라고 부른다.
암호화하는 여러가지 방식이 있다.
가장 직관적인 방법으로
블록1 → AES(키) → 암호화 블록1
블록2 → AES(키) → 암호화 블록2
블록3 → AES(키) → 암호화 블록3
문제는, 같은 평문 블록은 항상 같은 암호문 블록이 되니, 암호안에서 동일한 암호문 블록이 반복될 수 있다.
이러한 패턴이 읽혀 암호가 풀릴 수 있기에 사용하면 안되는 방식으로 분류된다.
IV를 이용해 암호화블록을 한번더 꼬는 방식
IV란? 암호화에 사용되는 랜덤한 초기값이다.
같은 평문이 매번 다른 암호문이 되도록 보장해준다.
해시의 Salt와 동일한 역할이다.
블록1: 평문블록1 XOR IV → AES(키) → 암호문블록1
블록2: 평문블록2 XOR 암호문블록1 → AES(키) → 암호문블록2
블록3: 평문블록3 XOR 암호문블록2 → AES(키) → 암호문블록3
저장형식: [IV(16바이트)] [암호문] //Salt처럼 공개되어도 상관이없다.
실제로 IV가 사용되는건 첫번째 평문블록을 암호화할때만이다.
매 암호화마다 IV를 수정해서 암호화해줘야 한다. 동일한 IV를 지속적으로 사용하면, 동일한 입력에 동일한 암호가 생성되어진다.
평문블록1 = AES_decrypt(암호문블록1, 키) XOR IV
평문블록2 = AES_decrypt(암호문블록2, 키) XOR 암호문블록1
평문블록3 = AES_decrypt(암호문블록3, 키) XOR 암호문블록2
AES는 암호화보다 복호화가 더 빠르다.
왜냐하면 복호화는 병렬로 실행이 가능하기때문이다.
평문블록으로 복호화하는데 필요한건 자기 블록과 이전 블록뿐이기때문이다.
이러한 이유로, 특정 블록이 손상되어도 손상이 전파되지않는다.
필요한건 자기 자신과 이전 블록 뿐이기때문이다.