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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
// 生成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);

验证

01
02
03
04
05
06
07
08
09
10
11
12
13
// 验证签名
  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);
}

c#使用椭圆签名算法制作软件序列号的更多相关文章

  1. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  2. 使用Camstudio和KeyCastOW来录屏制作软件Demo视频

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用Camstudio和KeyCastOW来录屏制作软件Demo视频.

  3. 网易云音乐 歌词制作软件 BesLyric

    导读 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦! BesLyric 为你排忧解难! 上个周末在用网易云音乐听歌,发现一些喜欢的歌还没有滚动歌词,然而网易云音乐还没有自带的歌词编辑功能,要制作歌 ...

  4. NSIS:制作软件升级安装包

    原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了.   现在,我们就来一步步把这个安装包做 ...

  5. 基于NSIS脚本开发的安装程序制作软件:易量安装

    原文 基于NSIS脚本开发的安装程序制作软件:易量安装 前几天“萝卜”给我推荐了一款安装程序制作工具——易量安装. 易量安装是一款安装程序制作软件,基于著名的NSIS(Nullsoft Scripta ...

  6. 使用.NET REACTOR制作软件许可证

    原文:使用.NET REACTOR制作软件许可证 软件下载地址:http://www.eziriz.com/downloads.htm 做一个简单的许可证系统,下面是具体步骤: 1,  OPEN AS ...

  7. 【全文转载】Precision Helper:最佳免费 CHM 制作软件

    跳至内容 善用佳软 IT义工的个人博客: 善用佳软= (善意+善于)应用优秀软件 xbeta= x(未知数)+β(改进测试版) Precision Helper:最佳免费 CHM 制作软件 许多用户都 ...

  8. 网易云音乐 歌词制作软件 BesLyric (最新版本下载)

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦!Beslyric 为你排忧解难! 本文 ...

  9. 【C#】VS2012+InstallShield2013制作软件更新包

    原文:[C#]VS2012+InstallShield2013制作软件更新包 上篇文章介绍了如何使用installshield制作软件的安装包,见地址:http://blog.csdn.net/cat ...

随机推荐

  1. 【启发式拆分】bzoj4059: [Cerc2012]Non-boring sequences

    这个做法名字是从武爷爷那里看到的…… Description 我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短.一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子 ...

  2. Spring Boot 应用 快速发布到linux服务器的脚本代码示例

    前提说明:spring boot 应用打包成jar包之后要部署到Linux服务器上面运行,我用的nohup java -jar 命令,但是代码更新之后重新部署的时候覆盖原来的项目,又要手动运行ps - ...

  3. python入门:从安装python开始

    python简介: Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明 ...

  4. Eclipse将java项目导出可执行的jar文件

    1.在java项目上右键,点击“Export”,会弹出一个选择导出的文件类型 版权声明:本文为博主原创文章,未经博主允许不得转载. 原文地址:https://www.cnblogs.com/poter ...

  5. rs485多主

    因复位时I/O口都输出高电平.如果把I/O口直接与RS-485接口芯片的驱动器使能端DE端相连,会在CPU复位其间DE为高,从而使本节点处于发送状态.如果此时总线上其它节点在发送数据,则此次数据传输将 ...

  6. Ice cream samples Gym - 101670G 滑动扫描

    题目:题目链接 思路:比赛中读错了题,题目要求选一个连续区间,却读成了随便选取几个柜台,英语要好好学啊,读懂题就很简单了,扫一遍就出结果了 AC代码: #include <iostream> ...

  7. Cinder配置多Ceph后端步骤

    1. 检查cinder当前backend配置 使用cinder service-list,查看cinder-volume服务的Host字段格式. 旧版格式: 新版格式: 旧版中Host字段是cinde ...

  8. 通过Proxool配置访问数据库的要点

    proxool 配置的时候有Proxool.properties 或者 Proxool.xml 两种方式初始化. 我的配置环境是 myEclipse10+tomcat6.0 + mysql5.0 . ...

  9. KVO And KVC

    http://www.cocoachina.com/industry/20140224/7866.html

  10. Leetcode36--->Valid Sudoku(判断给定的数独是否有效)

    题目:给定一个数独,某些部分已经被填上了数字,其余空的地方用‘.’表示:判断给定的数独是否有效: 数独规则: 每一行不能有重复的数字:每一列不能有重复的数字:将数独框划分为三行三列,没9个小方格不能有 ...