java加密解密ECDH笔记

ECDH背景:
1.ECC secp160r1,私钥长度20字节,压缩格式公钥21字节
2.ECDH协商得出20字节共享密钥,然后用AES128对实际信息加密。

问题:
将20字节共享密钥截取前16字节作为AES128的密钥是否会有安全隐患。

附:
原则上需要将20字节的共享密钥经过一个HASH算法变成16字节之后进行AES。

考虑到嵌入式平台,主频低,计算较慢,才考虑直接截取。

答:

不会有太大的问题。
ECDHE本来的作用就用于协商出对称加密后的密钥,也就是通信双方都拿到一个靠谱的密钥。
只要保证双方的密钥是一样,即可。

————————————————————————————————————————————————————————————————

ECC背景:

1、椭圆曲线定义:一条椭圆曲线在射影平面上满足方程:Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3的所有点的集合,
且曲线上每个点都是非奇异的。该方程又名维尔维斯特拉斯方程,椭圆曲线的形状不是椭圆,
只是因为其描述的方程类似于计算一个椭圆周长的方程。转换到笛卡尔坐标系下的方程为: y2+a1xy+a3y = x3+a2x2+a4x+a6

椭圆曲线密码体制来源于对椭圆曲线的研究,所谓椭圆曲线指的是由韦尔斯特拉斯(Weierstrass)方程:
y2+a1xy+a3y=x3+a2x2+a4x+a6 (1)所确定的平面曲线。其中系数ai(I=1,2,…,6)定义在某个域上,
可以是有理数域、实数域、复数域,还可以是有限域GF(pr),椭圆曲线密码体制中用到的椭圆曲线都是定义在有限域上的。

椭圆曲线上所有的点外加一个叫做无穷远点的特殊点构成的集合连同一个定义的加法运算构成一个Abel群。
在等式mP=P+P+…+P=Q (2)中,已知m和点P求点Q比较容易,反之已知点Q和点P求m却是相当困难的,
这个问题称为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个困难问题设计而来。
椭圆曲线应用到密码学上最早是由Neal Koblitz 和Victor Miller在1985年分别独立提出的。

解椭圆曲线上的离散对数问题的最好算法是Pollard rho方法,其时间复杂度为,是完全指数阶的。
其中n为等式(2)中m的二进制表示的位数。当n=234, 约为2117,需要1.6x1023 MIPS 年的时间。
而我们熟知的RSA所利用的是大整数分解的困难问题,目前对于一般情况下的因数分解的最好算法的时间复杂度是子指数阶的,
当n=2048时,需要2x1020MIPS年的时间。也就是说当RSA的密钥使用2048位时,ECC的密钥使用234位所获得的安全强度还高出许多。
它们之间的密钥长度却相差达9倍,当ECC的密钥更大时它们之间差距将更大。
更ECC密钥短的优点是非常明显的,随加密强度的提高,密钥长度变化不大。

对椭圆曲线来说最流行的有限域是以素数为模的整数域(参见 模运算)GF(p),或是特征为2的伽罗华域GF(2m)。
後者在专门的硬件实现上计算更为有效,而前者通常在通用处理器上更为有效。专利的问题也是相关的。
一些其他素数的伽罗华域的大小和能力也已经提出了,但被密码专家认为有一点问题。

无穷远点:射影几何中直线有一个无穷远点():就是无穷远点,直线的两端交于无穷远点(可把直线看作封闭曲线).
两条平行的直线可以看作相交在无穷远点,所有的平行直线都交于同一个无穷远点·

Abel群:阿贝尔群也称为交换群或可交换群,它是满足其元素的运算不依赖于它们的次序(交换律公理)的群。
阿贝尔群推广了整数集合的加法运算。阿贝尔群以挪威数学家尼尔斯·阿贝尔命名。

加法运算:任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,
过R’做y轴的平行线交于R。我们规定P+Q=R。

阶:椭圆曲线上一点P,存在正整数n,使得nP=O∞,则n为P的阶,若n不存在,则P是无限阶的,
有限域上定义的椭圆曲线上所有点的阶都存在。O∞+P=P,O∞为零元;曲线上三个点A,B,C处于一条直线上,则A+B+C=O∞;

2、加密过程
A选定一条椭圆曲线Ep(a,b),并取曲线上一点作为基点G
A选择一个私钥k,并生成公钥K=kG
A将Ep(a,b)和k,G发送给B
B收到后将明文编码到Ep(a,b)上一点M,并产生一个随机数r
B计算点C1=M+rK,C2=rG
B将C1,C2传给A
A计算C1-kC2=M+rkG-krG=M
A对M解码得到明文
攻击者只能得到Ep(a,b),G,K,C1,C2,没有k就无法得到M。


密钥磋商过程:
假设密钥交换双方为Alice、Bob,其有共享曲线参数(椭圆曲线E、阶N、基点G)。
1) Alice生成随机整数a,计算A=a*G。Bob生成随机整数b,计算B=b*G。
2) Alice将A传递给Bob。A的传递可以公开,即攻击者可以获取A。由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过A、G计算出a。Bob将B传递给Alice。同理,B的传递可以公开。
3) Bob收到Alice传递的A,计算Q=b*A
4) Alice收到Bob传递的B,计算Q‘=a*B
Alice、Bob双方即得Q=b*A=b*(a*G)=(b*a)*G=(a*b)*G=a*(b*G)=a*B=Q' (交换律和结合律),即双方得到一致的密钥Q。

加密和解密程序:ECC ElGamal和ECIES;密钥磋商:ECDH

3、JDK目录仅支持密钥的生成和解析,暂不支持加解密(使用NullCipher替换Cipher)

——————————————————————————————————————————————————————————————

DH背景:

DH,首个公开发表的公用密钥算法,是密钥磋商算法,而不是密钥交换算法(这一点要注意,与RSA传输密钥的实现不一样),也不能实现加密和数字签名,密钥不是由一方发送给另外一方,而是双方共同产生的一个密钥。
发送与接收双方共同拥有这个密钥对。要想计算出磋商后的密钥:
1)发送方:发送方的私钥+接收方的公钥计算
2)接收方:接收方的私钥+发送方的公钥计算
DH公钥常被称作份额(share),DH也使用模幂(这个在非对称算法中基本上都跑不掉)。

基本原理:
1)但是模数和RSA中的e可以任取不一样,DH的模数一定要是个大素数(通常被称做p),这个模数也是公开的
2)除了这个数字双方还需要共享另一个数字称为g(发生器)。因为g要满足:g^w mod p =Z的值W。因此g能产生从1到p-1的所有数字。所以有1<p<g
3)发送方随机产生一个大整数x, 计算GX=G^X mod P。(X需要保密)
4)接收方随机产生一个大整数y, 计算 GY=G^Y mod P. (Y需要保密)
5)发送方把GX发送给接收方,接收方把GY发送给发送方
6)发送方计算:ZZ(密钥) = GY ^ X mod P
7)接收方计算:ZZ(密钥) = GX ^ Y mod P

举个简单的例子:
1)p=3, g=11
2)发送方随机产生一个大整数x=5,计算GX=11^5 mod 3 = 2
3)接收方随机产生一个大整数y=7,计算GY=11^7 mod 3 = 2
4)发送方计算:ZZ(密钥) = 2 ^ 5 mod 3 = 2
5)接收方计算:ZZ(密钥) = 2 ^ 7 mod 3 = 2
这里面p取的值比较小,所以可能不太直观………

证明公式:
ZZ=GY^X mod p = ((g^Y mod p ) ^X) mod p
  = ((g^Y)^X) mod p (根据取模运算规则得到)
  = (g ^Y^X) mod p = ((g^X)^Y) mod p
  = (((g^X) mod p)^Y) mod p
  = GX^Y mod p

安全性分析:
目前还没有办法证明攻击都无法计算得出ZZ,普遍认为要想做到这一点要求同时拥有x和Gy或者y和Gx非常难。DH的计算公式都是单向函数,其逆运算就是求解离散对数问题,当前还没有高效计算离散对数的方法。
DH相比RSA,NB的地方在于RSA有一端需要对方的公钥都能继续,而DH一开始共享p和g,DH的算法的安全性基于p的大小以及x的大小。BTW:DH中X的选择与对称算法的相关性联系比较多,如果X选择太小,产生的ZZ太短,对于位数比较长的对称算法(如3DES,AES256)来说,这个密钥就比较弱了。

不足之处:
1)没有提供通信双方的身份信息,所以不能鉴别双方身份,容易遭受中间人攻击。
2)是密集型计算,容易遭受拒绝服务攻击,即攻击者请求大量密钥,被攻击者花费大量计算资源求解无用的幂系数。
3)无法防止重放攻击。

————————————————————————————————————————————————————————————

举个栗子:

椭圆曲线为secp256r1,:

curve参数: 
p=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF 
a=FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC
b=5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B 

G = 03 6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0 F4A13945 D898C296  // 基点G的压缩方式表达式 
G = 04 6B17D1F2 E12C4247 F8BCE6E5 63A440F2 77037D81 2DEB33A0  F4A13945 D898C296 4FE342E2 FE1A7F9B 8EE7EB4A 7C0F9E16 2BCE3357  6B315ECE CBB64068 37BF51F5  //基点G的非压缩方式表达式(这与证书文件中显示的是一致的) 

G=(Gx,Gy)   // 基点G的坐标表达式 
Gx=6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296 
Gy=4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5 
n =FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551 // 基点G的阶
h = 01   // cofactor,余因子
顺便说一说:我国家标准的ECC签名算法OID是:1.2.156.10197.1.501 
签名算法OID决定了签名算法以及曲线参数。


——————————————————————————————————————————————————————————————

分个级别:

Level of cryptographic protection

Domain

4Domain
ECDSA/ECDH key bits   Symmetric cipher key bits
secp160r1   160 80
secp192r1   192 96
secp224r1   224 112
secp256r1   256 128
上图错位了。自行脑部字段名右移一位

secp160r1速度最快,但是相对安全最弱。

安全生命周期
Domain Security life time
secp160r1 to 2010
secp192r1 to 2020
secp224r1 to 2030
secp256r1 beyond 2030



————————————————————————————————————————————————————————————————————————————

看下过程:

同时实现数据的完整性、数据加密和身份验证所使用到的机制如下:
       假设Bob和Rose进行通信:
          1】加密过程:
           Bob使用单向加密算法得出发送数据的特征码(用于数据完整性检测),Bob用自己的私钥加密此特征码(实现身份验证),并将此特征码置于数据的后面。Bob再生成一个密码D,用此密码加密加密过的特征码和数据(实现数据加密),此时生成的数据我们称其为Q,最后用Rose的公钥加密该密码D,并将D置于Q的后面。
          2】解密过程:
           Rose用自己的私钥解密得到D,然后用D解密得到数据和加密过得特征码,再用Bob的公钥解密此特征码,如果可以解密,则说明该数据是Bob发送的,反之,则不是。最后用单向加密算法计算该段数据的特征码,通过比较发送过来的特征码和Rose通过计算得到的特征码来确定此数据是否被篡改掉,如果特征码一致,则数据未发生改变;如果特征码不一致,则数据发生过改变。


参考文献:什么是椭圆曲线加密(ECC)? http://8btc.com/article-138-1.html


阅读更多

更多精彩内容