sgcCrypto は、Delphi と C++ Builder 向けの新しい汎用暗号ライブラリです。対称暗号、ハッシュ、デジタル署名、PKI、ポスト量子鍵交換をカバーする、43の純粋な Object Pascal ユニットで構成されています。デザインタイムコンポーネントはなく、Tsgc* クラスもなく、フォームに配置するものは何もありません。uses 節にユニットを追加し、RTL のルーチンを呼び出すのと同じように関数を呼び出すだけです。
sgcCrypto は sgcWebSockets Standard、Professional、Enterprise に無料で同梱されているため、これらのライセンスのいずれか、または All-Access をすでにお持ちであれば、すでに手元にあることになり、新たにインストールしたり注文したりする必要はありません。また、Core のみをお持ちの、あるいは sgcWebSockets のライセンスを一切お持ちでないお客様向けに、sgcWebSockets Core ランタイムを同梱した単体パックとしても販売されています。
仕組み
各ユニットは、TBytes を受け取り TBytes を返すだけの、単純な関数とプロシージャをエクスポートします。確保すべきコンテキストオブジェクトも、実装すべきインターフェースも、sgcCrypto_Reg.pas もありません。登録するものが何もないからです。すべてのライセンスに Pascal のフルソースが同梱されているため、プリミティブが DLL や OpenSSL バインディングの中に消えてしまうことなく、自分のデバッガでステップ実行できます。
このライブラリは外部ライブラリに一切依存していません。AES からポスト量子署名方式に至るまで、あらゆるアルゴリズムはそれを公開するユニット内に直接実装されており、同じソースコードが Delphi 7 から RAD Studio 13 まで、Win32、Win64、Linux64、macOS、iOS、Android の各プラットフォーム向けに変更なくコンパイルできます。
uses
sgcCrypto_Random, sgcCrypto_AES, sgcCrypto_Keccak, sgcCrypto_Ed25519,
sgcCrypto_MLKEM;
var
vKey, vIV, vPlain, vAAD, vTag, vCipher: TBytes;
vDigest, vSeed, vSignature, vMessage: TBytes;
vPublicKey, vPrivateKey, vSharedSecret, vCiphertext: TBytes;
begin
// AES-256-GCM: authenticated encryption in one call
vKey := sgcRandomBytes(32);
vIV := sgcRandomBytes(12);
vPlain := TEncoding.UTF8.GetBytes('confidential payload');
vCipher := sgcAES_GCM_Encrypt(vKey, vIV, vPlain, vAAD, vTag);
// SHA-3-256, one call, no context object to manage
vDigest := sgcSHA3_256(vPlain);
// Ed25519: sign a message
vSeed := sgcRandomBytes(32);
vMessage := TEncoding.UTF8.GetBytes('sign me');
vSignature := sgcEd25519_Sign(vSeed, vMessage);
// ML-KEM-768: post-quantum key encapsulation (FIPS 203)
sgcMLKEM_GenerateKeyPair(mlkem768, vPublicKey, vPrivateKey);
sgcMLKEM_Encapsulate(mlkem768, vPublicKey, vCiphertext, vSharedSecret);
end;
対称暗号と AEAD
sgcCrypto_AES は CBC、GCM、CTR に対応しています。sgcCrypto_Modes は ECB、OFB、CFB、暗号文盗用方式の CTS、そして AES Key Wrap と Key Wrap with Padding(RFC 3394 および RFC 5649)を追加し、sgcCrypto_CMAC は AES-CMAC を実装します。sgcCrypto_ChaCha は ChaCha20、XChaCha20、Salsa20、XSalsa20 を実装し、sgcCrypto_Poly1305 はこれらと Poly1305 を組み合わせて、RFC 8439 の ChaCha20-Poly1305 と XChaCha20-Poly1305 の AEAD 暗号を実現します。GCM であれ Poly1305 であれ、すべての認証タグは一定時間で比較されるため、検証に失敗しても推測がどれだけ近かったかが漏れることはありません。
ハッシュ、鍵導出、MAC
sgcCrypto_SHA2 と sgcCrypto_Keccak は SHA-1/2、SHA-3、SHAKE、cSHAKE、KMAC に対応し、sgcCrypto_Blake2b/Blake2s は BLAKE2 を追加します。sgcCrypto_HMAC は鍵付きメッセージ認証です。パスワードを鍵に変換する用途には、sgcCrypto_KDF(PBKDF2)、sgcCrypto_HKDF、sgcCrypto_Scrypt、そして Password Hashing Competition の優勝方式である Argon2 の d、i、id の全3種を実装する sgcCrypto_Argon2 があります。sgcCrypto_SipHash はハッシュテーブルのキー向けに高速な鍵付きハッシュを提供し、sgcCrypto_TLSH は暗号学的ダイジェストというより近似重複の検出に有用なファジー類似ハッシュです。
署名、鍵交換、PKI
sgcCrypto_Ed25519 と sgcCrypto_Ed448 は署名と検証を行い、sgcCrypto_X25519 と sgcCrypto_X448 はそれぞれに対応する Diffie-Hellman 鍵交換を行います。sgcCrypto_ECCurves は secp256k1 と3つの Brainpool 曲線上での ECDSA と ECDH を、RFC 6979 の決定論的ナンスとともに追加し、sgcCrypto_RSA_Keys は任意のビット長での RSA 鍵生成、OAEP 暗号化、PSS 署名に対応します。
PKI 側では、sgcCrypto_X509 が証明書を解析し、指定された発行者によって署名されたことを検証し、チェーンをたどって検証し、CRL で失効を確認します。sgcCrypto_X509_Gen は、まさにそのために構築された DER ライターの上に、サブジェクト代替名、鍵用途、CA のパス長制約を含む、自己署名の X.509 証明書や PKCS#10 CSR をゼロから生成します。
ポスト量子暗号
sgcCrypto は、NIST のポスト量子標準3種にも対応しています。sgcCrypto_MLKEM は、ML-KEM-512、768、1024 の全3パラメータセットにわたる FIPS 203 の鍵カプセル化を実装しており、不正な形式の暗号文に対しては暗黙的拒否を行うため、不正な入力が情報を漏らすことはありません。sgcCrypto_MLDSA は ML-DSA-44/65/87 による FIPS 204 の署名、sgcCrypto_SLHDSA は全6種の SHAKE パラメータセットにわたる FIPS 205 です。格子仮定は楕円曲線より歴史が浅いため、sgcCrypto_MLKEM_Hybrid は X25519 の秘密鍵と ML-KEM の秘密鍵を1つの共有鍵に組み合わせます。これは業界が収束しつつあるハイブリッド移行パターンです。
提供形態
sgcCrypto はsgcWebSockets Standard、Professional、Enterprise、および All-Access に無料で同梱されています。すでにこれらのライセンスのいずれかをお持ちであれば、43ユニットはすでにインストーラーに含まれており、別途注文する必要はありません。sgcWebSockets Core のみをお持ちの場合、または sgcWebSockets のライセンスを一切お持ちでない場合でも、sgcCrypto は Core ランタイムを同梱した単体パックとしても販売されています。同梱・単体を問わず、すべてのライセンスに Pascal のフルソースコードと1年間のアップデートが含まれます。
完全なユニットリファレンスを読み、実際にお試しいただけるのがsgcCrypto 製品ページです。
ご質問やフィードバックはありますか? お問い合わせください。コードを書いた本人たちから返信が届きます。
