ECIES 암호화 적용 기록
카테고리 | 기술 |
---|---|
태그 | |
수정일 | Aug 23, 2025 |
작성일 | Aug 20, 2025 |
Prologue
그리스 내 교통시스템 프로젝트를 진행하면서 AMKA, Passport 등 민감한 개인정보를 입력받아 전송해야 하는 기능이 필요
초기에는 RSA와 ECC 중 고민했으나, 보다 가벼운 ECC를 사용하기로 결정함.
보안 요구사항 (하이브리드 암호화)
- 서버에서 비대칭 키쌍(공개키/개인키) 생성
- 공개키를 API로 클라이언트에 전달
- 클라이언트는 대칭키(AES 등)를 생성해 폼 데이터 암호화
- 대칭키를 공개키로 암호화
- 암호화된 데이터 + 암호화된 대칭키를 서버로 전송
- 서버는 개인키로 대칭키 복호화, 이후 데이터 복호화 및 처리
👉 ECC 기반 암호화 방식 중 ECIES(Integrated Encryption Scheme) 를 이용하기로 결정.
처음에는 ECIES 자체가 하이브리드 암호화 방식인지 몰랐음… 의사소통을 원활히 하기 위해 기본적인 정의를 우선 학습함.
ECC 기반 암호화 유형
- ECDSA (Elliptic Curve Digital Signature Algorithm)
- 설명: 디지털 서명 생성 및 검증에 사용 → 데이터 무결성과 인증 보장
- 특징: RSA보다 짧은 키 길이로 동일 보안 수준 제공
- 용도: 블록체인(비트코인, 이더리움), 소프트웨어 서명, 인증서
- ECDH (Elliptic Curve Diffie-Hellman)
- 설명: 두 당사자 간 안전한 키 교환 프로토콜
- 특징: 비밀키를 직접 교환하지 않고 안전하게 공유 가능
- 용도: TLS/SSL, VPN, 암호화 통신
- ECIES (Elliptic Curve Integrated Encryption Scheme)
- 설명: 공개키 암호화 + 대칭키 암호화를 결합한 하이브리드 방식
- 특징: 공개키로 대칭키 암호화 + 데이터는 대칭키로 암호화
- 용도: 데이터 암호화, 안전한 메시지 전송
구현 과정
라이브러리 적용
- Server (Java) → BouncyCastle 라이브러리 사용
- Client (Vue) → eciesjs 라이브러리 사용
라이브러리를 이용하여 빠르게 해결하도록 시도.
하지만… 라이브러리마다 계산 방식, KDF, MAC 처리가 달라 호환되지 않는 문제 발생!
상세 옵션을 이용해볼까 싶었지만 라이브러리 BouncyCastle 의 암호화 방식이 너무 복잡하여 직접 암복호화 로직을 작성하기로 함.
암호화 알고리즘 분석
- Server (Java) → Cipher 이용
- Client (Vue) → Web Crypto API 이요
ECIES 구성
- 키 합의 (ECDH)
- 송신자와 수신자의 키를 이용해 공유 비밀키(Shared Secret) 생성
- 키 도출 함수 (KDF)
- 공유 비밀키를 기반으로
EncKey
(대칭키 암호화용)-
MacKey
(무결성 검증용)을 생성
- 공유 비밀키를 기반으로
- 대칭키 암호화 (AES 등)
EncKey
로 실제 평문 데이터를 암호화 → Ciphertext
- 무결성 검증 (MAC)
MacKey
를 이용해 Ciphertext에 대한 HMAC 생성- 데이터 위·변조 여부 확인
ECIES 흐름
image.png
- 송신자
- 수신자의 공개키로 ECDH 수행 → Shared Secret
- Shared Secret을 KDF로 처리 →
EncKey
,MacKey
EncKey
로 메시지 대칭 암호화 (AES)MacKey
로 HMAC 생성- 최종적으로:
Ciphertext + HMAC + 송신자 공개키
전송
- 수신자
- 송신자의 공개키 + 자신의 개인키로 ECDH 수행 → 동일한 Shared Secret
- 동일한 KDF 수행 →
EncKey
,MacKey
- HMAC 검증 → 메시지 무결성 확인
EncKey
로 암호문 복호화
구현
최종 결정 암호화 방식
ECIES
- Curve :
secp256r1
- Point Encoding:
? (Uncompressed | Compressed | Hybrid)
- KDF:
KDF2 with SHA-256
- 대칭암호화:
AES-256-CBC
AES
- Mode:
AES-256-CBC
- IV:
Random
- Padding:
PKCS5Padding
(PKCS7Padding 호환) - MAC:
HMAC-SHA256
Design
image.png
소스코드
Server
// Empty
Client
// Empty
리팩토링
기존에는 Form data 암호화와 ECIES 내부 암호화 방식이 상이하게 개발되었음.
Form data 암호화에 사용되는 대칭 암호화를 ECIES 내부에서도 동일하게 사용하게끔 개선
Server
// Empty
Client
// EMPTY
Epilogue
해당 업무를 진행하며 과거에 아무것도 모르고 그냥 무작정 암기했던 악몽같은 기술들이 새록새록 기억나면서 굉장히 신선했음.
Buffer 처리나 Web Crypto API 핸들링도 좀 더 능숙해졌고, 기본적인 암호화 구조나 개념들과도 좀 더 친해진 것 같음.
피와 살이 되는 경험이였던 것 같음…
참고
구현 Design sequence diagram
« 테스팅 문법 비교