c#使用椭圆签名算法制作软件序列号

简介:     椭圆曲线密码学(Elliptic curve cryptography,缩写为ECC)是基于椭圆曲线数学的一种公钥密码的方法。

    椭圆曲线密码学(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,经过测试比较稳定。

签名

  1. // 生成R=r*G  
  2. TBCryptoBigInteger r = null;  
  3. Random random = new SecureRandom();  
  4. do // Generate r  
  5. {  
  6.     r = new TBCryptoBigInteger(this.ecdomainpsCDKey.N.BitLength, random);  
  7. }  
  8. while (r.SignValue == 0);  
  9. ECPoint R = this.ecdomainpsCDKey.G.Multiply(r);  
  10. // Hash = SHA1(data,Rx,Ry)  
  11. string hashStr = Sha1(31, rawKeyBytes, R.X.ToBigInteger().ToByteArray(), R.Y.ToBigInteger().ToByteArray());  
  12. TBCryptoBigInteger hashInt = new TBCryptoBigInteger(hashStr, 2);  
  13. // sig = r-Hash*D (mod n)  
  14. TBCryptoBigInteger sig = r.Subtract(hashInt.Multiply(this.ecDCDKey)).Mod(this.ecdomainpsCDKey.N);  

 

验证

  1. // 验证签名  
  2. X9ECParameters ecps = X962NamedCurves.GetByOid(X9ObjectIdentifiers.Prime256v1);  
  3. ECPublicKeyParameters pk = new ECPublicKeyParameters("ECDSA",  
  4.     ecps.Curve.DecodePoint(Hex.Decode(KeyAttribute.GetKey(type.Assembly))),  
  5.     new ECDomainParameters(ecps.Curve, ecps.G, ecps.N, ecps.H));  
  6. ISigner s = SignerUtilities.GetSigner("ECDSA");  
  7. s.Init(false, pk);  
  8. s.BlockUpdate(bytes, 0, dataLen);  
  9. if (s.VerifySignature(sig))  
  10. {  
  11.     this.data = new byte[dataLen];  
  12.     Array.Copy(bytes, 0, this.data, 0, data.Length);  
  13. }  

相关文章
|
1月前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
58 1
|
3月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
40 1
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
46 1
|
1天前
|
数据采集 算法 机器人
软件体系结构 - 调度算法(3) 单调速率调度算法
【4月更文挑战第19天】软件体系结构 - 调度算法(3) 单调速率调度算法
14 0
|
8天前
|
安全 算法 网络安全
软件体系结构 - 非对称加密算法
软件体系结构 - 非对称加密算法
8 0
|
8天前
|
存储 算法 安全
软件体系结构 - 摘要算法
软件体系结构 - 摘要算法
6 0
|
9天前
|
负载均衡 算法
软件体系结构 - 负载均衡算法
软件体系结构 - 负载均衡算法
17 4
|
22天前
|
C#
手把手教你用C#写一个刷屏软件
手把手教你用C#写一个刷屏软件
|
1月前
|
机器学习/深度学习 存储 监控
使用Scala编写控制局域网上网软件的机器学习算法
在当今数字化世界中,对于使用控制局域网上网软件控制上网活动的需求越来越迫切。无论是家庭、学校还是企业,都需要有效的方法来监控和管理用户在局域网上的上网行为。本文将介绍如何使用Scala编写机器学习算法来实现这一目标,同时提供一些代码示例来说明具体的实现方式。
93 0
|
1月前
|
搜索推荐 C#
C#实现选择排序算法
C#实现选择排序算法
16 2