
X25519 + ML-KEM-768과 AES-256-GCM을 결합한 포스트퀀텀 하이브리드 암호화 라이브러리
포스트퀀텀 하이브리드 암호화 및 키 관리 서버.
Citadel은 키 캡슐화에 X25519 + ML-KEM-768을, 데이터 암호화에 AES-256-GCM을 결합하여 NIST의 포스트퀀텀 전환 하이브리드 방식을 따릅니다. 애플리케이션은 REST API를 통해 데이터를 암호화하고 복호화합니다. Citadel은 키 생성, 순환(rotation), 폐기(revocation), 접근 제어 및 감사 로깅을 관리합니다.
상태: 작동하는 구현체입니다. 감사(audit)되지 않았으며 프로덕션 배포 사례가 없습니다. 아래 보안을 참조하세요.
Your Application Citadel Database
| | |
|-- POST /encrypt ------->| |
| |-- hybrid KEM (X25519+ML-KEM) |
| |-- derive AES-256 key (HKDF) |
| |-- encrypt with AES-256-GCM |
|<-- encrypted blob ------| |
| |
|-- store blob ------------------------------------------>|
애플리케이션은 원시 키 자료(raw key material)를 직접 다루지 않습니다. 암호화된 blob은 자체 포함형(self-contained)으로, 래핑된 키, 알고리즘 식별자, 암호문을 포함합니다. 이를 아무 데이터베이스에나 저장하세요. 동일한 AAD와 컨텍스트를 사용해 Citadel로 다시 보내면 복호화됩니다.
citadel-envelope Hybrid encryption core (X25519 + ML-KEM-768 + AES-256-GCM)
citadel-keystore Key lifecycle management, 4-level hierarchy, threat-adaptive policies
citadel-api HTTP server, scoped API key auth, rate limiting, real-time dashboard
# Clone
git clone https://github.com/mrcord77/rust_citadel.git
cd rust_citadel
# Set your admin API key
echo -n "your-secret-key" | sha256sum | cut -d' ' -f1
# Copy the hash
# Start
CITADEL_API_KEY_HASH=<paste-hash> docker compose up -d
# Verify
curl http://localhost:3000/health
# {"status":"ok","version":"0.2.0"}
대시보드: http://localhost:3000
Rust 1.75+가 필요합니다.
cargo build --release -p citadel-api
CITADEL_API_KEY="your-secret-key" CITADEL_SEED_DEMO=true ./target/release/citadel-api
import requests
api = "http://localhost:3000"
headers = {"Authorization": "Bearer your-secret-key"}
# Encrypt
r = requests.post(f"{api}/api/keys/{dek_id}/encrypt", headers=headers, json={
"plaintext": "sensitive data",
"aad": "record-001", # binds ciphertext to this record
"context": "patient-records" # domain separation
})
blob = r.json()
# Decrypt
r = requests.post(f"{api}/api/decrypt", headers=headers, json={
"blob": blob,
"aad": "record-001",
"context": "patient-records"
})
plaintext = r.json()["plaintext"]
AAD 바인딩, 키 순환, 위협 인지 애플리케이션 동작을 포함한 완전한 작동 예제는 citadel_example.py를 참조하세요.
# Status
curl http://localhost:3000/api/status -H "Authorization: Bearer $KEY"
# List keys
curl http://localhost:3000/api/keys -H "Authorization: Bearer $KEY"
# Encrypt
curl -X POST http://localhost:3000/api/keys/$DEK_ID/encrypt \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"plaintext":"hello","aad":"test","context":"demo"}'
Root Key
└── Domain Key (per environment / business unit)
└── KEK — Key Encrypting Key (wraps DEKs)
└── DEK — Data Encrypting Key (encrypts application data)
NIST SP 800-57을 따릅니다. 각 계층은 침해 시 피해 범위(blast radius)를 제한합니다. DEK가 유출되어도 KEK가 분리되어 있으므로 다른 DEK까지 노출되지 않습니다.
| 범위 | 권한 |
|---|---|
read | 키, 상태, 메트릭, 위협 수준 조회 |
encrypt | 데이터 암호화 및 복호화 |
manage | 키 생성, 순환, 폐기, 파기 |
admin은 다른 모든 범위를 포함합니다. 최소 권한 원칙: 모니터링 대시보드에는 read, 애플리케이션 서비스에는 read + encrypt, 관리 도구에는 admin을 부여하세요.
Citadel은 보안 이벤트를 모니터링하고 키 정책을 자동으로 조정합니다:
위협 수준을 높이는 이벤트: 인증 실패, 복호화 실패, 빠른 접근 패턴, 수동 상향 조정. 점수는 시간이 지나며 감소합니다.
하이브리드 구성: 두 공유 비밀 값을 연결하여 HKDF에 입력합니다. X25519 또는 ML-KEM-768 중 어느 하나라도 안전하다면 보안이 유지됩니다.
version[1] || suite_kem[1] || suite_aead[1] || flags[1] || kem_ct_len[2] ||
x25519_ephemeral_pk[32] || mlkem768_ct[1088] || nonce[12] || aead_ct[variable]
자기 설명적(self-describing), 버전 관리되며 협상(negotiation)이 없습니다(다운그레이드 공격 방지). 전체 사양은 SPEC.md를 참조하세요.
subtle 크레이트를 통한 API 키 검증으로 타이밍 공격 방지Zeroizing<T>로 감싸 해제(drop) 시 0으로 초기화Citadel은 감사되지 않은 소프트웨어입니다.
이 구현은 검증된 Rust 크레이트(ml-kem, x25519-dalek, aes-gcm, hkdf)를 통해 NIST 표준화 프리미티브를 사용합니다. 자체적으로 암호화 알고리즘을 구현하지 않습니다. 가치는 새로운 수학이 아니라 올바른 구성에 있습니다.
수행된 작업:
수행되지 않은 작업:
독립적인 검토 없이는 민감한 데이터에 사용하지 마십시오. 취약점 신고는 SECURITY.md를 참조하세요.
NIST SP 800-57의 34개 통제 항목에 대해 매핑: 26개 충족, 7개 부분 충족, 1개 미흡. 전체 매핑은 COMPLIANCE_MATRIX.md를 참조하세요.
관련 프레임워크: NIST SP 800-57(키 관리), CNSA 2.0(PQC 일정), HIPAA(저장 데이터 암호화), SOC 2(접근 통제 및 감사).
rust_citadel/
├── citadel-envelope/ # Core hybrid encryption library
│ ├── src/
│ │ ├── envelope.rs # Encrypt/decrypt operations
│ │ ├── kem.rs # X25519 + ML-KEM-768 hybrid KEM
│ │ ├── kdf.rs # HKDF-SHA256 key derivation
│ │ ├── wire.rs # Wire format encode/decode
│ │ ├── aead.rs # AES-256-GCM wrapper
│ │ ├── aad.rs # Additional authenticated data
│ │ ├── error.rs # Uniform error types
│ │ └── sdk.rs # High-level API
│ ├── tests/ # KAT + roundtrip tests
│ └── fuzz/ # Fuzz targets
├── citadel-keystore/ # Key lifecycle management
│ └── src/
│ ├── keystore.rs # Key CRUD + state machine
│ ├── policy.rs # Crypto-period policies
│ ├── threat.rs # Adaptive threat intelligence
│ ├── storage.rs # File-based key storage
│ ├── audit.rs # Integrity-chained audit log
│ └── types.rs # Key types and states
├── citadel-api/ # HTTP server
│ └── src/
│ ├── main.rs # API routes, auth, rate limiting
│ └── dashboard.html # Real-time security dashboard
├── citadel_example.py # Python integration example
├── Backup-Citadel.ps1 # Backup/restore tooling
├── docker-compose.yml # Development deployment
├── docker-compose-production.yml # Production with TLS
├── SPEC.md # Wire format specification
├── THREAT_MODEL.md # Security goals and attacker model
├── COMPLIANCE_MATRIX.md # NIST 800-57 control mapping
└── CITADEL_OVERVIEW.md # Commercial overview
이 프로젝트는 이중 라이선스로 제공됩니다:
상업 환경에서 이 소프트웨어를 사용하거나 AGPL 조건을 준수하고 싶지 않다면 상업용 라이선스를 취득해야 합니다.
상업적 조건은 COMMERCIAL_LICENSE.md를 참조하세요.
AGPL 전문은 AGPL-3.0.txt 및 COPYING에 제공됩니다.
연락처: [email protected]
Andre Cordero — [email protected]
| 엔드포인트 | 메서드 | 범위 | 설명 |
|---|
/health | GET | — | 상태 확인 |
/api/status | GET | read | 위협 수준, 키 개수 |
/api/metrics | GET | read | 보안 메트릭 |
/api/keys | GET | read | 모든 키 나열 |
/api/keys | POST | manage | 새 키 생성 |
/api/keys/:id | GET | read | 키 세부 정보 가져오기 |
/api/keys/:id/activate | POST | manage | 대기 중인 키 활성화 |
/api/keys/:id/rotate | POST | manage | 키 순환(새 버전) |
/api/keys/:id/revoke | POST | manage | 키 영구 폐기 |
/api/keys/:id/destroy | POST | manage | 키 자료 파기 |
/api/keys/:id/encrypt | POST | encrypt | 데이터 암호화 |
/api/decrypt | POST | encrypt | 데이터 복호화 |
/api/threat | GET | read | 위협 인텔리전스 세부 정보 |
/api/policies | GET | read | 활성 키 정책 |
/api/auth/whoami | GET | read | 현재 API 키 정보 |
/api/auth/keys | GET | admin | API 키 나열 |
/api/auth/keys | POST | admin | API 키 생성 |
/api/auth/keys/:id | DELETE | admin | API 키 폐기 |
admin |
| 위 모든 권한 + API 키 관리 |
| 수준 | 트리거 | 대응 |
|---|
| LOW | 정상 운영 | 표준 암호 기간(crypto-period) |
| GUARDED | 경미한 이상 징후 | 순환 주기 약간 단축 |
| ELEVATED | 의심스러운 패턴 | 순환 일정 압축 |
| HIGH | 활성 위협 지표 | 강제 순환, 사용량 제한 축소 |
| CRITICAL | 공격 진행 중 | 최대 제한 |
| 구성 요소 |
|---|
| 알고리즘 |
|---|
| 표준 |
|---|
| 키 캡슐화(고전) | X25519 ECDH | RFC 7748 |
| 키 캡슐화(포스트퀀텀) | ML-KEM-768 | FIPS 203 |
| 데이터 암호화 | AES-256-GCM | NIST SP 800-38D |
| 키 파생 | HKDF-SHA256 | NIST SP 800-56C |
| 문서 | 대상 독자 |
|---|
| SPEC.md | 와이어 형식 사양 |
| THREAT_MODEL.md | 보안 목표 및 가정 |
| COMPLIANCE_MATRIX.md | NIST 800-57 규정 준수 매핑 |
| CITADEL_OVERVIEW.md | 상업적 포지셔닝 |
| SECURITY.md | 취약점 신고 |
| API_FREEZE.md | API 안정성 보장 |
| DEPLOYMENT.md | 프로덕션 배포 가이드 |
| QUICKSTART.md | 시작 가이드 |