暗号技術

sgcWebSockets には、純粋な Pascal のみで書かれた汎用暗号ライブラリであるsgcCryptoが含まれています。OpenSSL やその他の外部ライブラリに一切依存しておらず、Delphi 7 から Delphi 13 まで、Win32、Win64、Linux64、macOS、iOS 上で変更を加えることなくコンパイルできます。

 

このライブラリは、ハッシュ化とメッセージ認証、パスワードハッシュ化と鍵導出、対称暗号化、古典的な公開鍵暗号、ポスト量子暗号、X.509 証明書、ワンタイムパスワード、アーカイブ暗号化、そして類似重複検出のためのファジーハッシュをカバーしています。アルゴリズムファミリーごとに1つのユニットとして構成されているため(sgcCrypto_AES、sgcCrypto_MLKEM、sgcCrypto_TLSHなど)、アプリケーションは実際に呼び出すコードだけを取り込みます。

 

すべての関数はTBytesを受け取りTBytesを返す単純な呼び出しです。フォームにドロップするコンポーネントもデザイン時の設定もありません。以下に挙げるすべてのアルゴリズムの実装は、自身の出力だけと比較するのではなく、同じ標準の独立した実装(OpenSSL、Python のhashlib/cryptography、または標準の策定者が公開しているリファレンス実装)とバイト単位で相互検証されています。これにより、内部的には一貫しているものの誤っているというバグを検出できます。

 

ライブラリの有効化

 

暗号関連のユニットは、sgcVer.inc内のSGC_PACK_CRYPTO条件定義によって制御される Cryptography インストールパッケージに属しています。この定義がオフの場合、すべての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(鍵付き、最大512ビット) RFC 7693 sgcCrypto_Blake2b
ハッシュ化 BLAKE2s(鍵付き、最大256ビット) 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 ハッシュ — sgcCrypto_Legacy
ファジーハッシュ TLSH ダイジェストおよび距離 — 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、および PKCS#7、ゼロ、ANSI X9.23、ISO 7816-4、ISO 10126-2、TBC の各パディング方式 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 鍵生成、RSA-OAEP、RSA-PSS、PKCS#1 v1.5 署名/検証 RFC 8017 sgcCrypto_RSA_Keys、sgcCrypto_RSA
公開鍵暗号 RSA PKCS#1 v1.5 暗号化 RFC 8017 sgcCrypto_RSA_Keys
公開鍵暗号 Ed25519、Ed448(署名) RFC 8032 sgcCrypto_Ed25519、sgcCrypto_Ed448
公開鍵暗号 X25519、X448(鍵合意) RFC 7748 sgcCrypto_X25519、sgcCrypto_X448
公開鍵暗号 ECIES sealed box 暗号化 — sgcCrypto_ECIES
公開鍵暗号 NIST P-256、P-384、P-521 上の ECDSA / ECDH FIPS 186-5 sgcCrypto_EC、sgcCrypto_ECCurves
公開鍵暗号 secp256k1、brainpoolP256r1、brainpoolP384r1、brainpoolP512r1 上の ECDSA / ECDH SEC 2、RFC 5639 sgcCrypto_ECCurves
公開鍵暗号 ECDSA の DER エンコード署名、raw と DER の相互変換 RFC 3279 sgcCrypto_ECCurves、sgcCrypto_EC
公開鍵暗号 secp256k1 上の Schnorr 署名 BIP-340 sgcCrypto_ECCurves
公開鍵暗号 RSA および EC 鍵のエクスポートとインポート: PKCS#1、PKCS#8、SEC1、SubjectPublicKeyInfo、DER、PEM RFC 8017、RFC 5958、RFC 5280 sgcCrypto_RSA_Keys、sgcCrypto_ECCurves
ポスト量子暗号 ML-KEM-512/768/1024、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 の解析、チェーンおよび CRL の検証 RFC 5280 sgcCrypto_X509
証明書 & PKI X.509 自己署名証明書および PKCS#10 CSR の生成 RFC 5280、RFC 2986 sgcCrypto_X509_Gen
証明書 & PKI EC 鍵で署名した X.509 証明書と CSR、URI サブジェクト代替名 RFC 5280、RFC 2986 sgcCrypto_X509_Gen
証明書 & PKI PKCS#12(.pfx、.p12)の読み取り:リーフ証明書、チェーン、秘密鍵。AES を使う PBES2、および従来の Triple DES と RC2 のスキーム RFC 7292、RFC 9579 sgcCrypto_PKCS12
証明書 & PKI DER / ASN.1 リーダーおよびライター、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、定数時間比較、セキュアゼロ化、ランダムバイト生成 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 で標準化した3つの方式と、現在導入すべきハイブリッド構成について説明します。

 

6. 証明書 & PKI:受け取った X.509 証明書の解析と検証、および独自の自己署名証明書や PKCS#10 リクエストの生成(RSA 鍵または EC 鍵のいずれかで署名)について説明します。

 

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 の実際の使用方法を示し、推奨される選択の背後にある理由を説明しています。