c#使用橢圓簽名演算法制作軟體序列號
橢圓曲線密碼學(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,經過測試比較穩定。
簽名
- // 生成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);
驗證
- // 驗證簽名
- 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);
- }
相關文章
- Fabric 1.0原始碼分析(46)ECDSA(橢圓曲線數字簽名演算法)原始碼演算法
- 兄弟連區塊鏈教程Fabric1.0原始碼分析ECDSA橢圓曲線數字簽名演算法區塊鏈原始碼演算法
- WEBGL橢圓Web
- 一般橢圓方程和平移橢圓方程
- 蘋果軟體打包簽名原理蘋果
- 給軟體數字簽名
- c#畫圖(橢圓和弧線)Craphics類C#
- 中心橢圓演算法畫圖C++演算法C++
- CAD橢圓弧命令如何使用
- 使用者下載已簽名的軟體後 如何知道數字簽名是否可信
- 軟體序列號查詢軟體:Serial Box for MacMac
- 兄弟連區塊鏈教程區塊鏈資訊保安3橢圓曲線加解密及簽名演算法的技術原理二區塊鏈解密演算法
- 如何驗證 Bitcoin Core 軟體簽名
- 區塊鏈背後的資訊保安(3)橢圓曲線加解密及簽名演算法的技術原理及其Go語言實現區塊鏈解密演算法Go
- 【Openxml】將Openxml的橢圓弧線arcTo轉為Svg的橢圓弧線XMLSVG
- exe軟體如何進行數字簽名
- 一個好的設計簽名軟體
- Serial Box for mac(Mac軟體序列號大全)Mac
- Mac軟體序列號大全:Serial Box for macMac
- 蘋果企業簽名—ios簽名的演算法形式蘋果iOS演算法
- iOS簽名、iOS企業簽名、iOS超級簽名工具使用iOS
- 密碼學中的RSA演算法與橢圓曲線演算法密碼學演算法
- CAD繪圖工具——橢圓繪圖
- SVG <ellipse> 繪製橢圓SVG
- CSS繪製橢圓程式碼CSS
- mac軟體序列號機器人:KCNScrew for MacMac機器人
- java和C#使用證照對引數簽名、加密JavaC#加密
- 橢圓曲線加法原理計算
- CSS橢圓效果程式碼例項CSS
- 利用磁碟的序列號進行軟體加密 (轉)加密
- css實現圓形、橢圓和半圓效果程式碼例項CSS
- jmeter 壓測簽名演算法JMeter演算法
- 使用SHA256WithRSA來簽名和驗籤(.NET/C#)C#
- Qt 求圓和橢圓上任意角度點的座標QT
- 程式碼簽名證書,讓軟體真正擁有姓名!
- 軟體交付前為何需要進行程式碼簽名行程
- NEO GUI 多方簽名使用GUI
- 使用指令碼重簽名指令碼