转:https://blog.csdn.net/sszgg2006/article/details/41945163
公开密钥算法总是要基于一个数学上的难题。比如RSA 依据的是:给定两个素数p、q 很容易相乘得到n,而对n进行因式分解却相对困难。RSA 算法原理具体如下:找出两个“很大”的质数:P & Q N = P * Q M = (P – 1) * (Q – 1)找出整数E,E与M互质,即除了1之外,没有其他公约数找出整数D,使得 ED 除以 M 余 1,即 (E D) % M = 1,等价于E*D-1=K*M经过上述准备工作之后,可以得到:E是公钥,负责加密D是私钥,负责解密N负责公钥和私钥之间的联系加密算法,假定对X进行加密(X ^ E) % N = Y解密算法,根据费尔马小定义,可以使用以下公式完成解密(Y ^ D) % N = X备注:RSA算法原理可以参考阮一峰的一篇博文 也可参考维基百科
接下来我们看下椭圆曲线上是基于什么难题的?
ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点G,并选取一个整数k,求解K=kG很容易(注意根据kG求解出来的K也是椭圆曲线上的一个点);反过来,在椭圆曲线上给定两个点K和G,若使K=kG,求整数k是一个难题。ECC就是建立在此数学难题之上,这一数学难题称为椭圆曲线离散对数问题。其中椭圆曲线上的点K则为公钥(注意公钥K不是一个整数而是一个椭圆曲线点,这个点在OpenSSL里面是用结构体EC_Point来表示的,为了加深理解,建议自行下载OpenSSL进行查看学习),整数k则为私钥(实际上是一个大整数)。
不知我说明白了没有,这是网上的一位网友总结的,供参考:
考虑如下等式:K=kG [其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数],不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。这就是椭圆曲线加密算法采用的难题,我们把点G称为基点(base point)。
现在我们描述一个利用椭圆曲线进行加密通信的过程:
1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
2、用户A选择一个私有