首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 橢圓曲線簽名演算法實作軟體序號(二)

     編輯:關於C語言

簽名生成


// 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 編碼、大整數運算細節請參考社群相關文章。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved