sherwinzhu

单点登录解决方案

常用链接

统计

我的开源项目

最新评论

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,经过测试比较稳定。

签名

Code

 

验证

Code

 

另外,关于BASE24,大整数,大家可以看看园子里的文章。

posted on 2009-03-16 02:14 sherwinzhu 阅读(3543) 评论(18) 编辑 收藏

评论

#1楼 2009-03-16 08:57 LanceZhang      

椭圆密码,早有耳闻,果然很NB  回复 引用 查看   

#2楼 2009-03-16 09:37 腾云驾雾      

UP  回复 引用 查看   

#3楼 2009-03-16 09:40 C#ER      

博主是湖大的?  回复 引用 查看   

#4楼 2009-03-16 10:57 JacksonLin      

严重支持  回复 引用 查看   

#5楼 2009-03-16 13:43 dyb628[未注册用户]

学习了下  回复 引用   

#6楼 2009-03-16 14:14 Astral.Road      

这个 jmp掉...
怕的不是序列号算法可以被破解或者知晓,而是怕程序被反啊. 直接jmp掉.
 回复 引用 查看   

#7楼[楼主] 2009-03-16 15:47 sherwinzhu      

@Astral.Road
微软有个SLP,不知道效果怎么样,我是用SLP把关键代码用处理了。
另外,加了硬件信息和在线激活,呵呵。
 回复 引用 查看   

#8楼[楼主] 2009-03-16 15:52 sherwinzhu      

@C#ER
不是的,呵呵
 回复 引用 查看   

#9楼 2009-03-17 10:31 yw8888[未注册用户]

给个完整的示例代码  回复 引用   

#10楼[楼主] 2009-03-18 03:44 sherwinzhu      

@yw8888
BCCCrypto类库已经很好用了,上面给出的代码就是全部了。
TBCryptoBigInteger是.net3.5里的一个私有类,大整数。
 回复 引用 查看   

#11楼 2009-03-20 10:44 KT_730[未注册用户]

给个完整的示例代码  回复 引用   

#12楼 2009-03-24 14:17 一介农民      

TBCryptoBigInteger 这个类要用到哪个命名空间?  回复 引用 查看   

#13楼[楼主] 2009-03-24 15:43 sherwinzhu      

@一介农民
哦,这是反编译的微软dotnet3.5的BigInt类。有人做好了,可以直接用,你可以google一下
 回复 引用 查看   

#14楼 2009-05-29 02:00 zhkn      

看上去bouncycastle的实现也是事先为我们确定了椭圆曲线的参数(Prime192v1,Prime239v1,Prime256v1),
有什么办法生成自己的参数?
 回复 引用 查看   

#15楼[楼主] 2009-05-30 22:35 sherwinzhu      

@zhkn
可以自己选择参数,例子里有的,或者你按照他初始化的方法自己设定。
但是像Prime192v1,Prime239v1,Prime256v1这些参数,是标准建议的,有较好的安全性。
曲线第三者知道不会影响安全性,只要密钥k保户就好了
 回复 引用 查看   

#16楼 2009-05-30 23:56 zhkn      

的确可以可以自己选择参数,关键是怎么生成一套参数。
在选定了Fp(a,b)和基点G之后,怎么快速算出基点G的阶? 我是指当参数都是很大的时候。
 回复 引用 查看   

#17楼 2009-10-10 21:38 charles.sky[未注册用户]

请把完整源码发至charles.niu@tom.com,谢谢  回复 引用   

#18楼 2011-10-19 10:42 伟燕      

求源码..fu.weiping@live.cn  回复 引用 查看