ECC
<h3>椭圆函数离散对数问题</h3>
<p>k为正整数,P是椭圆曲线上的点(称为基点),已知k∗P和P,计算k
或
如果我们改一种记法,把椭圆曲线上点的加法记作乘法,原来的乘法就变成了幂运算,那么上述难题的形式跟离散对数问题应该是一致的。即:</p>
<p>k为正整数,P是椭圆曲线上的点,已知Pk和P,计算k=logPPk。</p>
<h3>有限域上椭圆函数</h3>
<p>但是密码学中,并不能使用上面介绍的实数域上的椭圆曲线。因为</p>
<ol>
<li>
<p>实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。</p>
</li>
<li>实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。</li>
</ol>
<p>所以我们需要引入有限域上的椭圆曲线。</p>
<p>所谓有限域上的椭圆曲线,简单来说就是满足下面式子要求的曲线(<code>x, y, a, b</code>都是小于素数<code>p</code>的非负整数):</p>
<p><code>y2modp=x3+ax+bmodp其中4a3+27b2≠0modp</code></p>
<p>对比一下原先的椭圆曲线的方程:</p>
<pre><code>y2=x3+ax+b其中4a3+27b2≠0</code></pre>
<p>可以看到这个只是对原式进行了简单的取模处理而已。实际上RSA和DH中也是基于这种形式的取模运算,它们其实也都是在有限域上进行的。</p>
<h3>密码局限</h3>
<p>椭圆曲线安全性依赖于基于椭圆曲线的有限群上的离散对数难题。与基于RSA的数字签名和基于有限域离散对数的数字签名相比,在相同的安全强度条件下,椭圆曲线方案有如下特点:签名长度短,密钥存储空间小,特别适用于存储空间有限、带宽受限、要求高速实现的场合(如在智能卡中应用)。
(1) P越大越安全,但越大,计算速度就越慢,160位可以满足目前的安全要求;</p>
<p>(2) 为了防止Pohlig-Hellman方法攻击,n为大于素数(n>),对于固定的有限域GF(P),n应当尽可能大;</p>
<p>(3) 因为+ax+b无重复因子才可基于椭圆曲线(a,b)定义群,所以要求4+27(mod p);</p>
<p>(4) 为了防止小步——大步攻击,要保证P的阶n足够大,要求n4;</p>
<p>(5) 为了防止MOV规范法和Smart法,不能选取超奇异椭圆曲线和异常椭圆曲线等两类特殊的曲线。</p>
<h3>加密通讯过程</h3>
<p>1.用户A选择椭圆曲线Ep(a,b),并选取基点G
2.用户A选择私钥k,生成公钥K=kG
3.用户A将Ep(a,b)和K,G传给用户B
4.用户接到信息后将带传输的明文编码到Ep(a,b)上的一点M,并产生一个随机整数r
5.用户B急死俺点C1=M+rK;C2=rG
6.用户B将C1,C2传给A
7.用户A收到信息后计算C1-kC2得到M,在对M解码得到明文。
密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:<code>T=(p,a,b,n,x,y)</code>。
<code>(p 、a 、b)</code> 用来确定一条椭圆曲线,p为素数域内点的个数,a和b是其内的两个大数;
<code>x,y</code>为G基点的坐标,也是两个大数;
<code>n</code>为点G基点的阶;
以上六个量就可以描述一条椭圆曲线,有时候我们还会用到h(椭圆曲线上所有点的个数p与n相除的整数部分)。</p>
<p>在非对称密钥体系中,用私钥进行签名公钥进行验签,但是对于<code>ECC</code>而言,在做签名与验签的时候除了私钥与公钥外还需要私钥与公钥对应的椭圆曲线,因为在签名和验签的过程中会涉及到多倍点的乘法,多倍点乘法会涉及到椭圆曲线。</p>
<p>所以,对于ECC算法来说,仅仅知道公钥和私钥是不能调用OpenSSL自带的签名和验签API,还需要知道对应的椭圆曲线:</p>
<pre><code>int ECDSA_sign(int type, const unsigned char *dgst, int dlen, unsigned char
*sig, unsigned int *siglen, EC_KEY *eckey)
int ECDSA_verify(int type, const unsigned char *dgst, int dgst_len,
const unsigned char *sigbuf, int sig_len, EC_KEY *eckey)</code></pre>