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