Croot Blog

Home About Tech Hobby Archive

ECIES 암호화 적용 기록

Prologue

그리스 내 교통시스템 프로젝트를 진행하면서 AMKA, Passport 등 민감한 개인정보를 입력받아 전송해야 하는 기능이 필요

초기에는 RSA와 ECC 중 고민했으나, 보다 가벼운 ECC를 사용하기로 결정함.

보안 요구사항 (하이브리드 암호화)

  1. 서버에서 비대칭 키쌍(공개키/개인키) 생성
  2. 공개키를 API로 클라이언트에 전달
  3. 클라이언트는 대칭키(AES 등)를 생성해 폼 데이터 암호화
  4. 대칭키를 공개키로 암호화
  5. 암호화된 데이터 + 암호화된 대칭키를 서버로 전송
  6. 서버는 개인키로 대칭키 복호화, 이후 데이터 복호화 및 처리

👉 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)
    • 설명: 공개키 암호화 + 대칭키 암호화를 결합한 하이브리드 방식
    • 특징: 공개키로 대칭키 암호화 + 데이터는 대칭키로 암호화
    • 용도: 데이터 암호화, 안전한 메시지 전송

구현 과정

라이브러리 적용

라이브러리를 이용하여 빠르게 해결하도록 시도.

하지만… 라이브러리마다 계산 방식, 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 흐름

0image.png

  1. 송신자
    • 수신자의 공개키로 ECDH 수행 → Shared Secret
    • Shared Secret을 KDF로 처리 → EncKey, MacKey
    • EncKey로 메시지 대칭 암호화 (AES)
    • MacKey로 HMAC 생성
    • 최종적으로: Ciphertext + HMAC + 송신자 공개키 전송
  2. 수신자
    • 송신자의 공개키 + 자신의 개인키로 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

1image.png

소스코드

Server

// Empty

Client

// Empty

리팩토링

기존에는 Form data 암호화와 ECIES 내부 암호화 방식이 상이하게 개발되었음.

Form data 암호화에 사용되는 대칭 암호화를 ECIES 내부에서도 동일하게 사용하게끔 개선

Server

// Empty

Client

// EMPTY

Epilogue

해당 업무를 진행하며 과거에 아무것도 모르고 그냥 무작정 암기했던 악몽같은 기술들이 새록새록 기억나면서 굉장히 신선했음.

Buffer 처리나 Web Crypto API 핸들링도 좀 더 능숙해졌고, 기본적인 암호화 구조나 개념들과도 좀 더 친해진 것 같음.

피와 살이 되는 경험이였던 것 같음…

참고

구현 Design sequence diagram

file