(4条消息) RSA(非对称加密)与ECC(椭圆曲线加密)的区别
1、RAS
2、ECC
椭圆曲线加解密算法原理
建立基于椭圆曲线的加密机制,需要找到类似RSA质因子分解或其他求离散对数这样的难题。而椭圆曲线上的已知G和xG求x,是非常困难的,此即为椭圆曲线上的的离散对数问题。此处x即为私钥,xG即为公钥。
椭圆曲线加密算法原理如下:
设私钥、公钥分别为k、K,即K = kG,其中G为G点。
公钥加密:
选择随机数r,将消息M生成密文C,该密文是一个点对,即:
C = {rG, M+rK},其中K为公钥
私钥解密:
M + rK - k(rG) = M + r(kG) - k(rG) = M
其中k、K分别为私钥、公钥。
椭圆曲线签名算法原理
椭圆曲线签名算法,即ECDSA。
设私钥、公钥分别为k、K,即K = kG,其中G为G点。
私钥签名:
1、选择随机数r,计算点rG(x, y)。
2、根据随机数r、消息M的哈希h、私钥k,计算s = (h + kx)/r。
3、将消息M、和签名{rG, s}发给接收方。
公钥验证签名:
1、接收方收到消息M、以及签名{rG=(x,y), s}。
2、根据消息求哈希h。
3、使用发送方公钥K计算:hG/s + xK/s,并与rG比较,如相等即验签成功。
原理如下:
hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s
= r(h+xk)G / (h+kx) = rG
3、RAS与ECC比较
数字签名技术已经广泛使用于网络安全协议或分布式系统中,目前比较流行的数字签名算法有RSA和ECDSA。很多同学在产品设计中往往都难以区分RSA和ECDSA的优劣,所以笔者将基于自己的实践,来给出一些初步的建议。
1. 密码强度比较
这是学术界普遍认可的密码强度对照表。比如,3072-bit的RSA密码强度,大约相当于283-bit的ECC密码强度,大约相当于128-bit的对称密码算法的强度。换句话说,攻击分组加密算法AES-128的难度,与攻击数字签名RSA-3072的难度相当。此外,我们应注意到,从RSA-1024到RSA-3072,模数长度增长了200%,但密码强度仅增强了50%左右;拿密码哈希函数来比较,这个安全强度的增长只是相当于从SHA1增强到SHA-256。
2. 性能比较
笔者基于开源的tommathlib实现了ECDSA(符合ANSI X9.62标准)和RSA签名算法(符合PKCS#1 v2.1, e=65537)。
表中数据是笔者基于自己的开发机器(Intel Xeon CPU E5520 @ 2.27GHz)上单线程运行得出的实验结果。对于ECDSA来说,生成签名与验证签名的开销相差不大,而对于RSA来说,验证签名比生成签名要高效得多,这是因为RSA可以选用小公钥指数,比如{3, 5, 17, 257 or 65537},而安全强度不变。如果只看单次操作,那么ECDSA的Sign操作比RSA的性能更好,而RSA的Verify要比ECDSA更好。
3. 结论
(1) RSA签名算法适合于:Verify操作频度高,而Sign操作频度低的应用场景。比如,分布式系统中基于capability的访问控制就是这样的一种场景。
(2) ECDSA签名算法适合于:Sign和Verify操作频度相当的应用场景。比如,点对点的安全信道建立。