// 1. 產生隨機數 r
TBCryptoBigInteger r = null;
Random rand = new SecureRandom();
do { r = new TBCryptoBigInteger(ecDomain.N.BitLength, rand); }
while (r.SignValue == 0);
// 2. R = r * G
ECPoint R = ecDomain.G.Multiply(r);
// 3. Hash = SHA1(data, Rx, Ry)
string hashStr = Sha1(31, rawKeyBytes, R.X.ToBigInteger().ToByteArray(), R.Y.ToBigInteger().ToByteArray());
TBCryptoBigInteger hashInt = new TBCryptoBigInteger(hashStr, 2);
// 4. sig = r - Hash * D (mod n)
TBCryptoBigInteger sig = r.Subtract(hashInt.Multiply(ecD)).Mod(ecDomain.N);
// 1. 從組件屬性取得公鑰點並重建參數
X9ECParameters ecps = X962NamedCurves.GetByOid(X9ObjectIdentifiers.Prime256v1);
ECPublicKeyParameters pk = new ECPublicKeyParameters("ECDSA",
ecps.Curve.DecodePoint(Hex.Decode(KeyAttribute.GetKey(assembly))),
new ECDomainParameters(ecps.Curve, ecps.G, ecps.N, ecps.H));
// 2. 初始化驗證器
ISigner signer = SignerUtilities.GetSigner("ECDSA");
signer.Init(false, pk);
signer.BlockUpdate(data, 0, dataLen);
// 3. 驗證
if (signer.VerifySignature(sig)) {
// 簽名有效,儲存資料
}
Base24 編碼、大整數運算細節請參考社群相關文章。