AES 암복호화를 위한 key생성 코드로 만들기
Contents
AES 암호화 알고리즘에 대하여.
- 암복호화가 가능한 대표적인 양방향 알고리즘입니다.
- 자료상으로 찾아보면 AES(Advanced Encryption Standard)는 대칭 키 암호화 방식의 대표적인 알고리즘으로, 미국 국립표준기술연구소(NIST)에 의해 2001년 표준으로 채택되었습니다. Rijndael 알고리즘을 기반으로 설계되었으며, 높은 보안성과 빠른 성능 덕분에 다양한 보안 애플리케이션에서 널리 사용되고 있습니다.
AES 특징
- 대칭 키 암호화: 동일한 키를 사용하여 데이터를 암호화 및 복호화합니다.
- 고정된 블록 크기: AES는 128비트 블록 크기를 사용합니다.
- 다양한 키 길이 지원: 128비트, 192비트, 256비트 키 길이를 제공합니다.
- 보안성: 기존의 DES(Data Encryption Standard)보다 강력한 보안성을 자랑합니다.
- 빠른 속도: 소프트웨어 및 하드웨어에서 효율적으로 동작합니다.
AES 암호화 과정
-
AES 암호화는 여러 라운드(Round)의 연산을 통해 이루어집니다. 사용되는 키 길이에 따라 라운드 수가 달라집니다.
- AES-128: 10 라운드
- AES-192: 12 라운드
- AES-256: 14 라운드
-
각 라운드는 다음과 같은 단계로 이루어집니다.
-
SubBytes (바이트 치환) 각 바이트를 S-Box(치환 테이블)를 이용하여 다른 값으로 치환합니다.
-
ShiftRows (행 이동) 각 행의 바이트를 왼쪽으로 이동하여 데이터의 패턴을 변화시킵니다.
-
MixColumns (열 혼합) 각 열의 데이터를 수학적 변환을 거쳐 혼합합니다. (마지막 라운드에서는 수행되지 않음)
-
AddRoundKey (라운드 키 추가) 현재 상태의 데이터 블록과 해당 라운드의 키를 XOR 연산하여 보안을 강화합니다.
AES 복호화 과정
- AES 복호화는 암호화 과정의 역순으로 진행됩니다. 주된 과정은 다음과 같습니다.
- InvSubBytes (역 바이트 치환)
- InvShiftRows (역 행 이동)
- InvMixColumns (역 열 혼합)
- AddRoundKey (라운드 키 추가)
- 이 과정을 통해 암호화된 데이터를 원래의 평문으로 복원할 수 있습니다.
AES의 활용
- AES는 높은 보안성과 성능 덕분에 다양한 환경에서 사용됩니다.
- SSL/TLS: HTTPS 통신을 보호하는데 사용됨
- VPN: 가상 사설망의 데이터 보호
- 디스크 암호화: 파일 및 디스크 보안
- 데이터베이스 보안: 저장된 데이터 보호
AES의 장점과 단점
장점
- 강력한 보안성을 제공하며 현재까지 실질적인 공격이 발견되지 않음
- 다양한 키 길이를 제공하여 유연한 보안 수준 선택 가능
- 빠른 연산 속도로 실시간 환경에서도 사용 가능
단점
- 대칭 키 방식이므로 키를 안전하게 공유하는 것이 어려움
- 암호화된 데이터의 크기가 평문과 동일하여 데이터 구조 분석 공격 가능성 존재
AES 운영 모드와 패딩
AES 운영 모드
- AES는 블록 암호이기 때문에 특정한 운영 모드를 선택해야 합니다. 대표적인 운영 모드는 다음과 같습니다.
- ✅ CBC (Cipher Block Chaining) 각 블록이 이전 블록의 암호문과 XOR 연산된 후 암호화됨. 초기화 벡터(IV)가 필요하며, 동일한 키를 사용하더라도 IV가 다르면 다른 암호문이 생성됨. PKCS5Padding 또는 PKCS7Padding과 자주 함께 사용됨.
- ✅ ECB (Electronic Codebook) 가장 단순한 운영 모드. 각 블록을 독립적으로 암호화함. 동일한 평문 블록은 동일한 암호문 블록으로 변환되므로 보안성이 낮음. 일반적으로 사용이 권장되지 않음.
- ✅ CFB (Cipher Feedback) 스트림 암호처럼 동작하여 블록 크기의 제약 없이 데이터 길이를 처리 가능. 초기화 벡터(IV)를 사용하여 보안성을 강화. 데이터 블록을 암호화한 후 일부를 잘라 평문과 XOR하여 암호문을 생성.
- ✅ OFB (Output Feedback) CFB와 유사하지만, 피드백을 통해 직접 암호화한 값을 XOR하여 사용. 오류 전파가 없어 한 블록이 손상되어도 이후 블록에는 영향을 미치지 않음.
- ✅ CTR (Counter Mode) 블록 단위가 아니라 카운터 값을 증가시키며 암호화를 수행. 병렬 연산이 가능하여 성능이 우수함. 스트림 암호처럼 사용되며 빠른 속도와 높은 보안성을 제공.
패딩(Padding) 방식
- AES는 128비트(16바이트) 블록 단위로 데이터를 처리하므로, 평문의 길이가 16바이트의 배수가 아닐 경우 패딩을 추가해야 합니다.
- ✅ PKCS5Padding / PKCS7Padding 가장 많이 사용되는 패딩 방식. 추가해야 하는 바이트 수만큼 해당 값을 패딩 값으로 설정함. 예) 0x03 0x03 0x03 (3바이트 패딩)
- ✅ NoPadding 패딩을 사용하지 않는 방식. 패딩 없이 사용하려면 입력 데이터가 반드시 블록 크기(16바이트)의 배수여야 함.
- ✅ ISO10126Padding 패딩 바이트 중 마지막 바이트는 패딩 길이를 나타내고, 나머지는 랜덤 값으로 채움.
- ✅ ZeroPadding 부족한 바이트를 0x00으로 채움. 일부 시스템에서만 사용 가능하며, 평문 데이터가 0x00 값을 포함할 경우 복호화 시 오류 발생 가능.
AES/CBC/PKCS5Padding 이외의 조합 예시
- 다양한 조합으로 AES를 사용할 수 있습니다.
- AES/ECB/PKCS5Padding → 블록별 독립 암호화 (권장되지 않음)
- AES/CBC/PKCS7Padding → CBC 모드에서 PKCS7 패딩 적용
- AES/CFB/NoPadding → 스트림 암호 방식, NoPadding 적용
- AES/OFB/ZeroPadding → OFB 모드, ZeroPadding 적용
- AES/CTR/NoPadding → 카운터 방식, 패딩 없이 처리 (가장 빠르고 안전함)
추천 조합
- 보안성과 성능을 고려했을 때 일반적으로 추천되는 조합은 다음과 같습니다.
- AES/CBC/PKCS7Padding → 일반적인 보안 애플리케이션
- AES/CTR/NoPadding → 높은 성능과 보안성이 필요한 경우
- AES/GCM/NoPadding → 인증된 암호화(AEAD)가 필요한 경우 (추천!)
AES/GCM (Galois/Counter Mode)
-
최근 가장 강력한 AES 모드로, 암호화와 메시지 인증을 동시에 수행하는 AEAD(Authenticated Encryption with Associated Data) 방식입니다.
-
✅ AES/GCM의 장점:
- 추가적인 메시지 인증 코드(MAC)를 생성하여 변조 방지 가능
- 빠른 속도 (병렬 처리 가능)
- 패딩이 필요 없음 (NoPadding)
-
💡 추천 사용 예시:
- HTTPS, TLS 1.2 이상
- VPN 보안
- 보안성이 중요한 애플리케이션
5. 정리
| AES 운영 모드 | 특징 | 보안성 | 추천 여부 |
|---|---|---|---|
| ECB | 동일한 입력 → 동일한 출력 (보안 취약) | 낮음 | ❌ |
| CBC | 블록 연결 방식, IV 사용 | 중간 | ✅ |
| CFB | 스트림 암호 방식, 부분적 암호화 가능 | 중간 | ✅ |
| OFB | 오류 전파 없음, 스트림 암호 방식 | 중간 | ✅ |
| CTR | 카운터 증가 방식, 병렬 처리 가능 | 높음 🔥 | 🔥 ✅ |
| GCM | AES + 인증 (무결성 검증 포함) | 최고 🔥🔥 | 🔥🔥 ✅✅ |
- 📌 AES를 사용할 때 가장 추천되는 방식은 AES/GCM/NoPadding입니다. 보안이 중요하지만 GCM을 사용할 수 없는 환경에서는 AES/CTR/NoPadding도 좋은 선택입니다.