橢圓曲線密碼學(Elliptic Curve Cryptography,簡稱 ECC)是一種基於橢圓曲線數學結構的公開金鑰加密技術。1985 年,Neal Koblitz 與 Victor Miller 獨立提出將其應用於密碼學。ECC 的優勢在於:在提供相同安全強度的前提下,所需的金鑰長度遠小於 RSA 等傳統算法,計算效率更高,適合資源受限環境。
橢圓曲線數位簽名算法(ECDSA)是 ECC 的典型應用。早期微軟產品的 25 位序列號即基於 ECDSA 實現。理論上 ECDSA 極難破解,但微軟為了控制序列號長度,將簽名長度限制在 62 位左右,導致私鑰空間縮小,使得暴力破解成為可能(這也是所謂「算號器」的原理)。
橢圓曲線通常定義為 Ep = (p, a, b, G, n, h):
y² ≡ x³ + ax + b (mod p) 的參數Ep(a,b) 與基點 Gk (k < n),計算公鑰 K = kGr (r < n),計算 R = rGHash = SHA(data, Rx, Ry)sig ≡ r - Hash × k (mod n)sig 與 Hash 編碼(如 Base24)生成序列號sig 與 HashR ≡ sig × G + Hash × K (mod p)H = SHA(data, Rx, Ry)H 與 Hash,相同則驗證通過.NET 3.5 引入了 ECDsaCng 類,但僅支援 Vista 及以上系統,且曲線參數固定為 NIST 標準曲線(P-256, P-384, P-521),無法使用自定義參數。為了靈活性,推薦使用成熟的第三方庫 BouncyCastle.Crypto (BCCCrypto),當前 1.4 版本穩定可靠,支援完整的 ECDSA 操作與自定義曲線參數。
// 生成 R = r * G
TBCryptoBigInteger r = null;
SecureRandom random = new SecureRandom();
do {
r = new TBCryptoBigInteger(this.ecDomainParams.N.BitLength, random);
} while (r.SignValue == 0);
ECPoint R = this.ecDomainParams.G.Multiply(r);
// Hash = SHA1(data, Rx, Ry)
string hashStr = Sha1(31, rawKeyBytes,
R.X.ToBigInteger().ToByteArray(),
R.Y.ToBigInteger().ToByteArray());
TBCryptoBigInteger hashInt = new TBCryptoBigInteger(hashStr, 2);
// sig = r - Hash * D (mod n)
TBCryptoBigInteger sig = r.Subtract(hashInt.Multiply(this.ecPrivateKey)).Mod(this.ecDomainParams.N);
// 使用標準曲線 Prime256v1 (secp256r1)
X9ECParameters ecps = X962NamedCurves.GetByOid(X9ObjectIdentifiers.Prime256v1);
ECPublicKeyParameters pk = new ECPublicKeyParameters("ECDSA",
ecps.Curve.DecodePoint(Hex.Decode(KeyAttribute.GetKey(type.Assembly))),
new ECDomainParameters(ecps.Curve, ecps.G, ecps.N, ecps.H));
ISigner signer = SignerUtilities.GetSigner("ECDSA");
signer.Init(false, pk);
signer.BlockUpdate(dataBytes, 0, dataLen);
if (signer.VerifySignature(sigBytes)) {
// 驗證通過,處理業務邏輯
}
序列號生成常需將二進位簽名轉為可讀字串。Base24 編碼(排除易混淆字元)是常見選擇。大整數運算可直接使用 BouncyCastle 提供的 BigInteger 類,支援模運算、位運算等。相關實現可參考社群開源專案。
ECDSA 結合自定義曲線參數,能構建相對安全的軟體授權體系。關鍵在於:妥善保護私鑰、使用足夠長度的簽名、引入硬體特徵碼綁定、採用混淆加殼防止逆向分析。BouncyCastle 為 .NET 開發者提供了強大、靈活的密碼學工具箱,是實作此類需求的首選。