中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

C#使用橢圓簽名算法制作軟件序列號

2018-07-20    來源:open-open

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

    橢圓曲線密碼學(xué)(Elliptic curve cryptography,縮寫為ECC)是基于橢圓曲線數(shù)學(xué)的一種公鑰密碼的方法。橢圓曲線在密碼學(xué)中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。

    橢圓簽名算法應(yīng)該是微軟最先用在軟件保護上的,我們平常用的25位序列號就是基于橢圓簽名算法的。理論上說,橢圓簽名算法是很難破解的,因為...(省 略,感興趣的可以看看《ECC加密算法入門介紹》這篇文章)。但是因為微軟出于序列號長度的考慮,簽名的長度只有62bit(具體是多少,忘了),所以可 以暴力計算私鑰。我們用過的算號器就是這樣的。

定義:
橢圓曲線Ep=(p,a,b,G,n,h)
p、a、b 用來確定曲線,G為基點,n為點G的階,h是橢圓曲線上所有點的個數(shù)m與n相除的整數(shù)部分

簽名過程
1,選擇一條橢圓曲線Ep(a,b),和基點G
2,選擇私有密鑰k(k<n,n為G的階),利用基點G計算公開密鑰K=kG
3,取一個隨機整數(shù)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)。

好吧,言歸正傳,我們?nèi)绾卧赾#中使用橢圓簽名算法呢?

在.Net3.5中,微軟提供了ECDsaCng類,但是局限性是必須在Vista系統(tǒng)上才能使用,另外就是微軟的實現(xiàn)事先為我們確定了橢圓曲線的參數(shù)(ECDsaP256,ECDsaP384,ECDsaP521),我們沒有辦法使用自己的參數(shù)。關(guān)于ECDsaCng類的使用,已經(jīng)有人做了介紹,MSDN里也有說明。這里我要說的是如何使用第三方類庫。

這里介紹的第三方加密類庫是BCCCrypto(http://www.bouncycastle.org/csharp/),現(xiàn)在的版本是1.4,經(jīng)過測試比較穩(wěn)定。

簽名

// 生成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);  
    }  

標(biāo)簽:

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Android 平臺創(chuàng)建 XY 圖表的完整例子

下一篇:JTable 一個最好的例子