椭圆签名算法:c#使用椭圆签名算法制作软件Software序列号来源: 发布时间:星期四, 2009年3月19日 浏览:0次 评论:0
椭圆曲线密码学(Elliptic curve cryptography缩写为ECC)是基于椭圆曲线数学种公钥密码思路方法椭圆曲线在密码学中使用是在1985年由Neal Koblitz和Victor Miller分别独立提出 椭圆签名算法应该是微软最先用在软件Software保护上我们平常用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里也有介绍说明这里我要说是如何使用第 3方类库 这里介绍第 3方加密类库是BCCCrypto(http://www.bouncycastle.org/csharp/)现在版本是1.4经过测试比较稳定 签名 Code 1 // 生成R=r*G 2 TBCryptoBigInteger r = null; 3 Random random = SecureRandom; 4 do // Generate r 5 { 6 r = TBCryptoBigInteger(this.ecdopsCDKey.N.BitLength, random); 7 } 8 while (r.SignValue 0); 9 ECPo R = this.ecdopsCDKey.G.Multiply(r); 10 // Hash = SHA1(data,Rx,Ry) 11 hashStr = Sha1(31, rawKeyBytes, R.X.ToBigInteger.ToByteArray, R.Y.ToBigInteger.ToByteArray); 12 TBCryptoBigInteger hashInt = TBCryptoBigInteger(hashStr, 2); 13 // sig = r-Hash*D (mod n) 14 TBCryptoBigInteger sig = r.Subtract(hashInt.Multiply(this.ecDCDKey)).Mod(this.ecdopsCDKey.N); 验证 Code 1 // 验证签名 2 X9ECParameters ecps = X962NamedCurves.GetByOid(X9ObjectIdentiers.Prime256v1); 3 ECPublicKeyParameters pk = ECPublicKeyParameters("ECDSA", 4 ecps.Curve.DecodePo(Hex.Decode(KeyAttribute.GetKey(type.Assembly))), 5 ECDoParameters(ecps.Curve, ecps.G, ecps.N, ecps.H)); 6 ISigner s = SignerUtilities.GetSigner("ECDSA"); 7 s.Init(false, pk); 8 s.BlockUpdate(s, 0, dataLen); 9 (s.VerySignature(sig)) 10 { 11 this.data = [dataLen]; 12 Array.Copy(s, 0, this.data, 0, data.Length); 13 } 0
相关文章读者评论发表评论 |