ECC椭圆曲线算法-1

转:https://wonderful.blog.csdn.net/article/details/72850486

原文 http://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/

 

Preface

椭圆曲线的研究可以被追溯至十九世纪中叶,那是代数学家、几何代数学家、以及数论专家都在研究。本书描绘了椭圆曲线中一些完美的特性。1984年,Hendrik Lenstra阐述了一个依据于椭圆曲线的因数分解算法。这就导致了研究者重新去研究椭圆曲线在密码学以及数论算法的新应用。

 

1976年,WhitfieldDiffie和Martin Hellman开创了公钥密码学的先河;次年,Ron Rivest、Adi Shamir、Len Adleman提出了一个在当下还非常著名的、基于整数分解难题的RSA算法。1985年,Neal Koblitz 和Victor Miller提出了椭圆曲线密码学(ECC),它和RSA有着相同的公钥密码学功能。然而它和RSA所基于的数学难题不同,它基于椭圆曲线的离散对数问题(ECDLP)。目前,解决ECDHP最行之有效的方法需要消耗指数运算时间,这比整数分解所需要的时间大的多,这也就意味着,相同大小的输入,ECC能够比RSA提供更高的安全性。例如160比特的椭圆曲线密钥和1024比特的RSA密钥的安全性相当。越小的密钥在速度、效率、带宽、存储上有着许多优势。

 

本书作为安全研究员、开发者入门教材,同样也适合那些好奇椭圆曲线如何应用在安全软件上的人。阅读者最好有计算机科学与技术、工程、数学背景。本书目前没有罗列大量的数学公式,这毕竟不是给数学家去看的,但是每章结尾处有附录,方便大家深入了解。

 

章节概述

本书重点研究有限域算法(第二章)和椭圆曲线算法(第三章),第四章提供了一些ECDLP问题的攻击、秘钥对的验证以及生成、ECDSA签名、公钥加密方法、密钥协商。我们不会使用数学公式去描述ECDLP的攻击,也不会去描述“椭圆曲线点”的计算方法,因为实在太晦涩难懂了。二、三、四章的内容深受NIST撰写的ECDSA算法。第五章描述了在软件上和硬件上如何高效的实现算法,以及侧道攻击。老实说,第五章内容比较有限的,但是还是希望能给软件开发者以及硬件开发者一点参考。

 

鸣谢

一堆人。

第一章

 

简介

 

椭圆曲线有着丰富的历史,它已经被研究了超过100年。它被用来解决许多问题,其中一个问题就是“congruent number problem”,它要求一个数是直角三角形的的边,并且该直角三角形三边都是有理数。另一个例子是费马大定理:当n大于2时等式无非零整数解。

1985年,Neal Koblitz和Victor Miller独立的提出了使用椭圆曲线来设计公钥密码学系统。自从那时起,大量的关于椭圆曲线的安全性研究以及关于椭圆曲线的高效实现的文章被不断的发表。90年代,椭圆曲线被标准化,并且被大量的私企所采用,一次椭圆曲线系统开始接受许多商业捐助。

 

本章目的是介绍公钥密码学,以及它和传统的对称密码学的区别,特别介绍了椭圆曲线的密码学的优点。当然这些介绍都是很浅的,详细的我们会在后面的章节里介绍。

 

我们在1.1节中将介绍密码学的基础以及目标,对称密码学和公钥密码学的区别。1.2节中我们会看到RSA、离散对数、椭圆曲线公钥密码学系统。1.3节中将三者比较,然后解释为什么椭圆曲线密码学有哪些好处。1.4节中给出了后续章节的内容。1.5节中给出了椭圆曲线的参考资料。

 

1.1 密码学基础

 

密码学是使用数学手段设计和分析,以至能够在恶意对手出现的情况下,也能安全的通信。

 

基本通信模型

 

图1中,终端A(Alice)和终端B(Bob)在一个不安全信道上传输数据。我们假设所有的通信内容都暴露在恶意对手(Eve)之下,他的目的是获取A、B之间的通信内容。

ECC椭圆曲线算法-1

 

 

ECC椭圆曲线算法-1

例如,A和B可能是两个使用手机的人,E在尝试窃听他两的通话。或者说,A是一个Web网页浏览器,A’使用A访问B,B上有B’提供的产品,A’想购买B’,信道是Internet,对手E能够获取到A和B之间的信息,因此可以获取到A’的信用卡内容,或者可以冒充A’或者B’。第三个例子,考虑这么一种情况,A要发送一封Email给B,对手E能够读到这个信息,改写一部分内容,或者冒充A,发送E自己的信息给B。最后,考虑这个场景,A是一个智能卡,他的拥有者A’正在通过银行总部的服务器验证自己身份。E可以监控并且获取A’的认证信息,或者冒充A’来提取A’账户中的钱。上面几个例子应该很明显的指出了,一个通信实体,可能不仅仅是一个人,而可能是一台电能、智能卡、软件模块,或者例如银行的组织机构。

 

安全的目标

 

上面几个例子揭示了安全通信的几个核心

1:保密性:A发送到B的数据只有他两能看到,E不能看到。

2:数据完整性:B有能力检测到从A收到的数据是否被E修改。

3:Data origin authentication

4:身份认证:B能够确认和自己通信的对方是否是A还是其他冒充者。

5:抗抵赖性:B收到的数据,能够确保是来自A,并且B也能使得第三方中立机构确信该数据来自A,即A不能抵赖自己发送了这个数据。

 

对立模式

为了构建A和B实际面对的威胁,我们一般假设E是可靠的。除了E能够获取信道上所有的数据,并且E还能修改和劫持数据。除此之外,假设E有足够的计算机资源,并且知晓所有的通信协议和加解密系统。密码学的设计就是为了在该强大对手的情况下,还能安全传输。

对称加密密码学

 

广泛的讲,密码学分为2种,对称加密(图1.2),通信的实体首先确定密钥,接着使用对称加密算法,例如DES、RC4,AES算法来保证数据的保密。还可能会使用MAC算法,例如HMAC来保证数据的完整性和“data

origin authentication”。

例如我们想要保密性,并且现在只有A和B知道密钥key,A要使用加密函数Enc和key加密一个明文数据m得到密文c=Enc(m),然后发送给B。当B收到C,B会使用解密函数Dec和同样的key进行解密,m=Dec(c)。如果使用了MAC来进行数据的完整性,则A、B实现会协商一个MAC时使用的key,并且加密前会计算t=MAC(m),A会将m+t进行加密发送给B。B收到数据时会计算t’=MAC(m),然后比较t是否等于t’。

 ECC椭圆曲线算法-1

 

 

ECC椭圆曲线算法-1

秘钥分发和管理

 

对称加密的主要优势在于其效率,但是这个同有多个大的缺点。其中一个问题叫做秘钥分发问题,它需要秘钥在信道上传递时是秘密的,并且能够保证传到了自己想传的实体。有些应用,使用可信的传递者进行秘钥传递。另一个方法是在网上,使用可信的第三方,该第三方事先已经与所有的实体进行了秘钥的传递,然后使用这个秘钥对将要传递的密钥进行加密。如果真的存在这个可信的第三方,那么这样进行密钥传递是可行的。但是不存在这样可信的第三方。

 

另一个缺点。。。

 

太基础了,翻译不下去了,跳过,自己看原文。

 

 

 

 

 

 

 

 

公钥密码学

 

公钥密码学流程见图1.2b,1975年由Diffie Hellman和Merkle提出,目的是解决上文提出的对称加密的缺点。

和对称加密相比,公钥加密可以交换密钥。每个通信实体选择一个密钥对(e,d),公钥是e,私钥是d(私钥是被实体安全的秘密的保存着)。密钥有这么一个特性:通过公钥很难计算得到私钥。

 

保密性

如果实体A想要发送一个密文数据m到B,B可以把公钥直接明文传输到A,然后A使用B的公钥加密m,即得到c=Enc(m)。B可以使用私钥进行解密,即m=Dec(c),得到明文m。上面的过程有一个假设,那就是一个中间人知道仅仅知道公钥,是无法进行解密的。我们观察到,B的公钥无需保密,只要保证A收到的是的确是B的公钥,即A能确定收到的公钥是认证的几颗。否则A如果收到的是E的公钥,那么使用E公钥加密后的C,可以轻松被E使用私钥进行解密得到明文。

 

不可抵赖性

不翻译了。。

 

 

1.2 Public-key cryptography

 

RSA略。。。

 

1.2.2 离散对数系统

 

离散对数系统是1976年由Diffie和Hellman提出的,起初是密钥协商协议。1984年,EIGamal使用离散对数来进行公钥加解密和签名。自从那时起,许多不同的公钥加解密和签名算法被不断的提出。接下来会介绍ElGamal公钥加解密系统和DSA签名算法。

 

DL key generation

 

在离散对数系统中,一个密钥对往往需要一个参数(p,q,g)。P是一个素数,q是p-1的素因数,g的范围在1~p-1,g的阶是q(即满足g^t=1(modp)的t最小取值是q)。私钥k是从1~q-1中随机获得,公钥是y=g^x mod p,给定y和(p,q,g),是很难获得x的,这属于离散对数问题。DL参数生成和密钥对生成见1.6和1.7。

 ECC椭圆曲线算法-1

 

 

DL encryption scheme

 

1.8和1.9中我们罗列了ElGamal公钥加密和解密的流程。如果y作为接受者(解密者)的公钥,发送者要加密一个m,则计算m*y^k mod p,k是发送者随机生成的。总的来说,发送者需要发送c2=my^k mod p和c1=g^k mod p给接受者。

接受者计算c1^x mod p=>g^(kx) mod p=>y^k mod p,然后再除c2,则得到m。

上一篇:Android 连接匿名WiFi的示例代码


下一篇:Java中的方法