암호화

sgcWebSockets에는 sgcCrypto가 포함되어 있으며, 이는 순수 Pascal로만 작성된 범용 암호화 라이브러리입니다. OpenSSL이나 다른 외부 라이브러리에 대한 의존성이 전혀 없으며, Win32, Win64, Linux64, macOS, iOS에서 Delphi 7부터 Delphi 13까지 변경 없이 그대로 컴파일됩니다.

 

이 라이브러리는 해싱과 메시지 인증, 비밀번호 해싱과 키 유도, 대칭 암호화, 전통적인 공개 키 암호화, 포스트 양자 암호화, X.509 인증서, 일회용 비밀번호, 아카이브 암호화, 그리고 근사 중복 탐지를 위한 퍼지 해시를 다룹니다. 알고리즘 계열별로 하나의 유닛으로 구성되어 있어(sgcCrypto_AES, sgcCrypto_MLKEM, sgcCrypto_TLSH 등), 애플리케이션은 실제로 호출하는 코드만 가져오게 됩니다.

 

모든 함수는 TBytes를 받고 반환하는 단순한 호출입니다. 폼에 배치할 구성 요소도 없고 디자인 타임 설정도 없습니다. 아래에 나열된 모든 알고리즘의 구현은 자기 자신의 출력과만 비교한 것이 아니라, 동일한 표준의 독립적인 구현(OpenSSL, Python의 hashlib/cryptography, 또는 표준 제정자가 공개한 참조 구현)과 바이트 단위로 교차 검증되었습니다. 이는 내부적으로는 일관되지만 실제로는 잘못된 버그를 찾아내는 방법입니다.

 

라이브러리 활성화

 

암호화 유닛들은 Cryptography 설치 패키지에 속하며, sgcVer.inc의 SGC_PACK_CRYPTO 조건부 정의로 제어됩니다. 이 정의가 꺼져 있으면 모든 sgcCrypto_* 유닛은 빈 스텁으로 컴파일되어, 필요하지 않은 빌드에서 이 팩을 제외할 수 있습니다. 설치 프로그램에서 패키지를 선택하거나, 소스에서 직접 컴파일하는 경우 프로젝트 옵션에서 SGC_PACK_CRYPTO를 정의하십시오.

 

프로젝트에서 FIPS 승인 알고리즘만 사용해야 한다면, 선택적인 SGC_CRYPTO_FIPS 정의가 컴파일 타임에 sgcCrypto 유닛에서 그 밖의 모든 알고리즘을 제거합니다. 이 정의는 기본적으로 꺼져 있습니다. 무엇이 유지되고 무엇이 제거되는지, 그리고 왜 FIPS 140-3 검증이 아닌지는 FIPS 모드를 참조하십시오.

 

sgcCrypto 유닛은 또한 라이브러리의 나머지 부분이 OpenSSL 없이 실행되도록 해 줍니다: sgcCryptoBackend 런타임 스위치(또는 선택적 SGC_NATIVE_CRYPTO 정의)와 iohNativeTLS IOHandler입니다. OpenSSL 없이 실행하기를 참조하십시오.

 

이 페이지에서 다루는 내용

 

아래 표는 전체 목록입니다: 라이브러리가 구현하는 모든 알고리즘과 각 알고리즘이 위치한 유닛을 보여줍니다. 이어지는 페이지들은 각 계열을 하나씩 설명하며, 정확한 함수 시그니처와 짧은 Delphi 예제를 함께 제공합니다.

 

카테고리 알고리즘 표준 단위
해싱 SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 FIPS 180-4 sgcCrypto_SHA2
해싱 SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256, cSHAKE, KMAC FIPS 202, SP 800-185 sgcCrypto_Keccak
해싱 BLAKE2b (keyed, up to 512 bit) RFC 7693 sgcCrypto_Blake2b
해싱 BLAKE2s (keyed, up to 256 bit) RFC 7693 sgcCrypto_Blake2s
해싱 SipHash-2-4 — sgcCrypto_SipHash
해싱 RIPEMD-160, HMAC-RIPEMD160 ISO/IEC 10118-3, RFC 2286 sgcCrypto_Legacy
해싱 (레거시) MD4, MD5, DES-ECB, NTLM v1 hash — sgcCrypto_Legacy
퍼지 해싱 TLSH digest and distance — sgcCrypto_TLSH
메시지 인증 HMAC-SHA1/256/384/512, HMAC-MD5 FIPS 198-1 sgcCrypto_HMAC
메시지 인증 AES-CMAC RFC 4493 sgcCrypto_CMAC
메시지 인증 AES-GMAC SP 800-38D sgcCrypto_CMAC
메시지 인증 Poly1305 RFC 8439 sgcCrypto_Poly1305
비밀번호 해싱 및 KDF PBKDF2 (SHA-1/256/384/512) RFC 8018 sgcCrypto_KDF
비밀번호 해싱 및 KDF KDF1, KDF2, ANSI X9.63 KDF ISO 18033-2, ANSI X9.63 sgcCrypto_KDF
비밀번호 해싱 및 KDF scrypt RFC 7914 sgcCrypto_Scrypt
비밀번호 해싱 및 KDF Argon2d, Argon2i, Argon2id RFC 9106 sgcCrypto_Argon2
비밀번호 해싱 및 KDF HKDF (SHA-256/384) RFC 5869 sgcCrypto_HKDF
대칭 암호화 AES-128/192/256: ECB, CBC, CFB, OFB, CTR, CBC ciphertext stealing, GCM FIPS 197, SP 800-38A/D sgcCrypto_AES, sgcCrypto_Modes
대칭 암호화 AES-CBC with no padding, and the PKCS#7, zero, ANSI X9.23, ISO 7816-4, ISO 10126-2 and TBC padding schemes SP 800-38A, ISO/IEC 9797-1 sgcCrypto_AES, sgcCrypto_Modes
대칭 암호화 AES-CCM (AEAD) RFC 3610, SP 800-38C sgcCrypto_Modes
대칭 암호화 AES Key Wrap, AES Key Wrap with Padding RFC 3394, RFC 5649 sgcCrypto_Modes
대칭 암호화 ChaCha20, XChaCha20, Salsa20, XSalsa20 RFC 8439 sgcCrypto_ChaCha
대칭 암호화 ChaCha20-Poly1305, XChaCha20-Poly1305 (AEAD) RFC 8439 sgcCrypto_Poly1305
공개 키 암호화 RSA key generation, RSA-OAEP, RSA-PSS, PKCS#1 v1.5 sign/verify RFC 8017 sgcCrypto_RSA_Keys, sgcCrypto_RSA
공개 키 암호화 RSA PKCS#1 v1.5 encryption RFC 8017 sgcCrypto_RSA_Keys
공개 키 암호화 Ed25519, Ed448 (signatures) RFC 8032 sgcCrypto_Ed25519, sgcCrypto_Ed448
공개 키 암호화 X25519, X448 (key agreement) RFC 7748 sgcCrypto_X25519, sgcCrypto_X448
공개 키 암호화 ECIES sealed box encryption — sgcCrypto_ECIES
공개 키 암호화 ECDSA / ECDH on NIST P-256, P-384, P-521 FIPS 186-5 sgcCrypto_EC, sgcCrypto_ECCurves
공개 키 암호화 ECDSA / ECDH on secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1 SEC 2, RFC 5639 sgcCrypto_ECCurves
공개 키 암호화 ECDSA DER encoded signatures, raw and DER conversion RFC 3279 sgcCrypto_ECCurves, sgcCrypto_EC
공개 키 암호화 Schnorr signatures on secp256k1 BIP-340 sgcCrypto_ECCurves
공개 키 암호화 RSA and EC key export and import: PKCS#1, PKCS#8, SEC1, SubjectPublicKeyInfo, DER and PEM RFC 8017, RFC 5958, RFC 5280 sgcCrypto_RSA_Keys, sgcCrypto_ECCurves
포스트 양자 암호화 ML-KEM-512/768/1024, hybrid X25519 + ML-KEM-768, X-Wing, X25519MLKEM768, SecP256r1MLKEM768, SecP384r1MLKEM1024 FIPS 203, RFC 9935, RFC 10024, draft-connolly-cfrg-xwing-kem sgcCrypto_MLKEM, sgcCrypto_MLKEM_Hybrid
포스트 양자 암호화 ML-DSA-44/65/87 FIPS 204, RFC 9881, RFC 9964 sgcCrypto_MLDSA
포스트 양자 암호화 SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f FIPS 205, RFC 9909 sgcCrypto_SLHDSA
인증서 및 PKI X.509 parsing, chain and CRL verification RFC 5280 sgcCrypto_X509
인증서 및 PKI X.509 self-signed certificate and PKCS#10 CSR generation RFC 5280, RFC 2986 sgcCrypto_X509_Gen
인증서 및 PKI EC signed X.509 certificates and CSRs, URI subject alternative names RFC 5280, RFC 2986 sgcCrypto_X509_Gen
인증서 및 PKI PKCS#12 (.pfx, .p12) reading: leaf certificate, chain and private key. PBES2 with AES, and the legacy Triple DES and RC2 schemes RFC 7292, RFC 9579 sgcCrypto_PKCS12
인증서 및 PKI DER / ASN.1 reader and writer, PEM, Base64 — sgcCrypto_ASN1, sgcCrypto_DER
일회용 비밀번호 HOTP, TOTP RFC 4226, RFC 6238 sgcCrypto_OTP
아카이브 암호화 WinZip AE-1 / AE-2 WinZip AE-2 sgcCrypto_Zip_AE2
인코딩 및 유틸리티 Hex, Base32, Base64url, constant time compare, secure zero, random bytes RFC 4648 sgcCrypto_Encoding, sgcCrypto_Random

 

하나씩 설명

 

1. 해싱 및 메시지 인증: SHA-2, SHA-3, SHAKE, BLAKE2, SipHash, HMAC, AES-CMAC, Poly1305 등, 이 페이지의 거의 모든 다른 알고리즘이 기반으로 삼는 구성 요소입니다.

 

2. 비밀번호 해싱 및 키 유도: PBKDF2, scrypt, Argon2id, HKDF. 비밀번호를 저장하는 것과 기존 비밀 값에서 키를 유도하는 것은 서로 다른 작업입니다. 이 페이지에서는 그 이유와 각 작업에 어떤 함수가 적합한지 설명합니다.

 

3. 대칭 암호화: 라이브러리가 지원하는 모든 모드의 AES, AES 키 래핑, ChaCha20/Salsa20 및 이들의 Poly1305 AEAD 구성, 그리고 왜 인증된 모드를 기본 선택으로 삼아야 하는지를 다룹니다.

 

4. 공개 키 암호화: RSA, Ed25519/Ed448 서명, X25519/X448 키 합의, ECIES, NIST, secp256k1, Brainpool 곡선에서의 ECDSA/ECDH, 그리고 BIP-340 Schnorr 서명을 다룹니다.

 

5. 포스트 양자 암호화: ML-KEM, ML-DSA, SLH-DSA, NIST가 FIPS 203-205에서 표준화한 세 가지 방식과, 오늘날 배포해야 할 하이브리드 구성을 다룹니다.

 

6. 인증서 및 PKI: 수신한 X.509 인증서를 파싱하고 검증하는 방법, 그리고 RSA나 EC 키로 서명한 자체 서명 인증서와 PKCS#10 요청을 직접 생성하는 방법을 다룹니다.

 

7. 일회용 비밀번호: HOTP와 TOTP, 즉 인증 앱이 생성하는 코드를 다루며, 프로비저닝 URI도 포함합니다.

 

8. 퍼지 해싱 (TLSH): 근사 중복 탐지를 위한 지역성 민감 해시로, 이 페이지의 다른 모든 해시와 달리 무결성이나 보안을 위한 것이 아닙니다.

 

9. WinZip AE-2 아카이브 암호화: .zip 아카이브 내부에서 사용되는 AES 암호화와, 그것이 보호하는 것과 보호하지 않는 것을 다룹니다.

 

10. FIPS 모드: 라이브러리에 FIPS 승인 알고리즘만 남기는 컴파일 타임 스위치로, 무엇을 제거하고 무엇을 검사하는지, 그리고 왜 FIPS 140-3 검증이 아닌지를 다룹니다.

 

데모

 

Demos\18.Cryptography 폴더에는 위의 각 영역(해싱, 대칭 암호화, 비밀번호, 공개 키, 포스트 양자, 인증서, WinZip AE-2를 포함한 일회용 비밀번호)마다 하나씩 실행 가능한 애플리케이션 7개가 들어 있으며, 각각 API 사용법을 보여주고 권장되는 선택의 근거를 설명합니다.