c#使用橢圓簽名演算法製作軟體序號

來源:互聯網
上載者:User

標籤:加密   block   ==   cas   bytes   sub   cti   param   array   

橢圓曲線密碼學(Elliptic curve cryptography,縮寫為ECC)是基於橢圓曲線數學的一種公開金鑰密碼的方法。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。
橢圓簽名演算法應該是微軟最先用在軟體保護上的,我們平常用的25位序號就是基於橢圓簽名演算法的。理論上說,橢圓簽名演算法是很難破解的,因為...(省略,感興趣的可以看看《ECC密碼編譯演算法入門介紹》這篇文章)。但是因為微軟出於序號長度的考慮,簽名的長度只有62bit(具體是多少,忘了),所以可以暴力計算私密金鑰。我們用過的算號器就是這樣的。
定義:
橢圓曲線Ep=(p,a,b,G,n,h)
p、a、b 用來確定曲線,G為基點,n為點G的階,h是橢圓曲線上所有點的個數m與n相除的整數部分
簽名過程
1,選擇一條橢圓曲線Ep(a,b),和基點G
2,選擇私人密鑰k(k<n,n為G的階),利用基點G計算公開密鑰K=kG
3,取一個隨機整數r(r<n),計算點R=rG
4,計算特徵資訊和R的散列值,即Hash=SHA(data,x,y)
5,計算sig≡r-Hash*k(mod n) 
6,使用sig和Hash產生序號(例如使用BASE24編碼)
驗證過程
1,從序號中提取sig和Hash
2,計算R≡sig*G+Hash*K (mod p)
3,計算計算特徵資訊和R的散列值,即H=SHA(data,x,y)
4,比較H和Hash
實際上,上述過程就是Elliptic Curve DSA (ECDSA)。
好吧,言歸正傳,我們如何在c#中使用橢圓簽名演算法呢?
在.Net3.5中,微軟提供了ECDsaCng類,但是局限性是必須在Vista系統上才能使用,另外就是微軟的實現事先為我們確定了橢圓曲線的參數(ECDsaP256,ECDsaP384,ECDsaP521),我們沒有辦法使用自己的參數。關於ECDsaCng類的使用,已經有人做了介紹,MSDN裡也有說明。這裡我要說的是如何使用第三方類庫。
這裡介紹的第三方加密類庫是BCCCrypto(http://www.bouncycastle.org/csharp/),現在的版本是1.4,經過測試比較穩定。
簽名

0102030405060708091011121314 // 產生R=r*G  TBCryptoBigInteger r = null;  Random random = new SecureRandom();  do // Generate r  {      r = new TBCryptoBigInteger(this.ecdomainpsCDKey.N.BitLength, random);  }  while (r.SignValue == 0);  ECPoint R = this.ecdomainpsCDKey.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.ecDCDKey)).Mod(this.ecdomainpsCDKey.N);


驗證

01020304050607080910111213 // 驗證簽名  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 s = SignerUtilities.GetSigner("ECDSA");  s.Init(false, pk);  s.BlockUpdate(bytes, 0, dataLen);  if (s.VerifySignature(sig)){     this.data = new byte[dataLen];     Array.Copy(bytes, 0, this.data, 0, data.Length);}

c#使用橢圓簽名演算法製作軟體序號

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.