1、椭圆 曲线加密 算法 椭圆曲线密码学(英语: Elliptic curve cryptography,缩写为 ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在 1985年由 Neal Koblitz和 Victor Miller分别独立提出的。 ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥 比如 RSA加密算法 提供相当的或更高等级的安全。 ECC的另一个优势是可以定义群之间的双线性映射,基于 Weil对或是 Tate对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长 1.
2、 椭圆 曲线 在数学上,椭圆曲线 ( 英语: Elliptic curve,缩写为 EC)为一 代数曲线 ,被下列式子所定义 2 = 3 + + 其是无奇点的;亦即,其图形没有 尖点或自相交。 满足此条件 的 a b 满足 : 43 +272 0 图 1 在 基础上需要定义一个无穷远的 点,将 此点作为 零点 : 此时 椭圆曲线 定义为 : (,) 2|2 = 3 + +,43 +272 00 在椭圆 曲线中 的 群的运算律: 1. 所有的 点都在椭圆曲线上 2. 0点作为 群上的 单元 点即 +0 = 3. P点关于 X轴 的对称点为 P点 的逆即 +(P) = 0 4.对于 位于同一条直线
3、上的三个点 P,Q,R.则有 P+Q+R = 0 图 2 P+Q+R=0(无限远点 P Q R三个 点的 位置是 任意的 , 他们满足加法的结合律, 因为 这个群是一个阿贝尔群。 2. 椭圆 曲线 加法 当 P和 Q不相等 时 ( ) 由于 是在 阿贝尔 群上 可以 将 P+Q+R = 0 改写为 P+Q = R所以 在椭圆曲线上 的 加法定义为 P Q 两点 加法为 P,Q两点 连线与 曲线 的交点 R的关于 X轴 对称 点R 图 2-3 P+Q=-R P Q两点 的直线 的 斜率为: = 这条线 与曲线的交点为: = (,) = 2 = +( ) 因此 (,)+(,) = (,) 如果 在
4、图上 表示 即为上述的 + = 当 P和 Q不相等 时 ( = )( = ) 因为 p+(p) = 0 图 3 P Q两点 相同时 直线 的斜率为 = 32 +2 经计算 的 = 32 +2 = 2 = +( )图 4 3. 椭圆 曲线 标量乘法 通过上面 的加法运算我们可以得出 其 标量乘法运算可以得出 = + + times从上式 可以看出当我们计算 nP的 时候 需要 做 n次 加法, 如果 n有 k位 那么 的计算时间复杂度变为 O(2),这显然 不是 快捷 的方式。 其中 一种加快计算的方式是将这些加法 运算 的 次数 减少 ,我们 将 n写 成 2进制 形式 ,然后 我们 按每位计
5、算,每次复用上一次的结果如 当 n = 151时 ,其二进制位100101112 所以 151 = 127 +026 +025 +124 +023 +122 +121 +120= 27 +24 +22 +21 +20 所以 如果运用 在 上面的标量乘法 时 ,其运算可以简化为 : 151 = 27 +24 +22 +21 +20 4. 离散空间椭圆 曲线 我们 将 曲线 上的点 全部 局限于 上此时离散 形式的 椭圆曲线 变为: (,) ()2 | 2 3 + +(mod),43 +272 0(mod)0 0仍然 为无穷 远 点 , a,b 为 整数 图 5 2 3 7 +10(mod) p
6、= 19,97,127,487的 图示 在 离散 椭圆 图上的加法和 曲线 上的加法的定义 类似 , 在离散 的 椭圆 曲线中, 直线的方程 变为 + + 0(mod),点 P, Q两点 的加法 的 操作也是基于 这个 定义 上下图 展示了 2 3 +3(mod127)曲线上 = (16,20) 和 =(41,120)两点 之间的加法 直线 4 +83(mod127) 在此 空间上是一组距离相等的平行线 图 6 5. 离 散椭圆 曲线 代数加法 对照 曲线上的加法 , 离散空间椭圆曲线加法公式可以写作 = (2 ) = +( )= +( )如果 , 此时的 m的 值 的 形式为 = ( )(
7、)1 如果 P = Q时 : = (32 +)(2)1 在 离散型的 椭圆 空间 里面我们 知道点 的 数目是有限的, 而 这些点的 个数 我们称为椭圆曲线群的阶数 同样的在离散 空间,对于 曲线 上的 点 同样满足标量加法的法则 = + + times但是 在离散空间 椭圆 曲线 加法 会有一个有趣的现象,对一个点进行 有限次 的加法,存在一个是 n使得 nP = P 例如在 曲线 2 3 +2 +3(mod97)的 一点 P = (3,6),计算 其 的 标量乘法, 计算 结果如下: 图 7 可以 看出 P = (3,6)经过 6次加法后又回到本身 , 也即是 5P = 0 所以 对于 P
8、的 加法可以写作 kP = (k mod 5)P 可以 证明的是一个 点 的加法所构成的子集是一个循环的子集 首先 一个点的加法所得到的点一定是有限的,因为加法所 获得 的点全部 都在父集上的,父集的大小是有限的,所以经过有限次的加法后所获得的 结果 必定会重复, 那么 结 果 就会重复下去。只需 证明 第一个重复的值是 P即可 。 假设 第一个重复的值不是 P, 而是 kP,那么后面 的结果也必然 是 kP的 倍数,假设重复的次数为 n, 如果 gcd(n,k)不为 1, 那 么 存在使得 km mod n = 0 即 kmP = 0即 (km +1)P = P与 假设矛盾 如果 gcd(n
9、,k) = 1那么 kmP = (m mod n) 那么 存在一个数使得 mk mod n = 1 即 mkP = (mk mod n)P = P与 假设 矛盾。 在 一个循环子集中将 P称之为生成 点或者基点 ,其 子集的 点 的 大小 n称之为子集的阶 即 nP = 0 由 拉格朗日定理 可知 子群的阶 n是 全集阶 N的 因子 例如 2 = 3 +3在 37上 N = 42 它的 子集大小 只能 n = 1,2,3,6,7,14,21,42为基点 P = (2,3),因为 0, 2 0 7 = 0 所以构成 的子集的 大小 为 7 如果 在 29上 ,其阶为 N=37 所以 其子集大小
10、只能 为 n = 1或者 37 对于 ECC(椭圆加密 算法 ), 需要找到一个 具有 高阶子集 , 一般情况下 选择 一个椭圆 曲线并 计算 他的阶,然后找到一个数字大的因子 n作为子集的阶 ,如果 这个子集的基点为 P则 nP = Np = 0 给定 n和 P, 那么需要计算 n次 计算出 Q = nP,如果 只 给出 P,Q如何计算出 n这就是所谓的 对数 问题 。这个 问题也就是椭圆曲线的 离散对数 问题 而求解 这个对数问题是非常困难的,而正是由于这种困难使得我们使用椭圆加密算法变得更加可靠 与 其他 类似 的 加密算法 相比 ,破解椭圆加密算法更加困难 ,这也意味着 更少位数的 秘
11、钥 k可以达到同类算法同样的 安全 强度 6. 椭圆加密算法 ECDH 和 ECSDA 椭圆加密算法 是基于有限域 的离散型 的椭圆曲线的循环子集 上 ,定义一个这样的子集 需要 以下参数, 有限域 的大小素数 P 椭圆 曲线方程 a和 b 用于 生 成 子集的基点 G 子集 的阶 n 子集 的 辅因子 h 总的 来说一个椭圆加密 算法 基于 (,)参数 上 (1) ECDH 同 其他非对称加密算法一样,需要计算 私钥 和公钥, 在 ECC中 私钥是一个随机数 d来自 于 1, 1(n是 子集的阶 ) 公钥 是曲线上的一个点 H = dG( G是 子集的基点 ) 如果 我们知道 d和 G, 找
12、到 公钥 H是很 容易的,但是如果只知道 H和 G找到 私钥 d是及其困难的, 这等同 有 在做 离散对数问题,上文有提到这个问题在现在来 说 还没有有效的算法,所以是很困难的。 ECDH是 迪夫赫尔曼 算法 的一个变种, 它 实际上是一个秘钥 共识 协议, ECDH协议 定义了秘钥的 如何 产生 以及 如何 交换 秘钥 。 如果 Alice和 Bob需要交换秘钥,中间人 Hack可以 在两者之间监听 1. Alice和 Bob使用 同样 参数 的椭圆曲线,并且随机产生各自的秘钥 和 ,并且 计算 出各自 的公钥 = 和 = , 2. 他们彼此 交换各自的公钥 和 ,而 中间人也将 他们 的公
13、钥 截获, 但是他们都不能从这些信息中 计算出 他们的私钥 3. Alice计算出 = , Bob计算出 = ,明显 的是他们各自 计算 出的 结果 是一致的 。 = = () = () = 而 中间人 不能从 公钥中计算出 S, 所以 Alice和 Bob共享了密码 S,这也 正是 迪夫赫尔曼 所要 解决 的问题 。 当 Alice和 Bob获得了共同的 秘钥 S, 他们就可以 使用 对称加密算法如 AES,3DES来 加密他们的信息了。 (2) ECSDA签名 算法 在 比特币的交易中,一笔交易会在整个区块链网络中传播,每个节点需要 验证 一笔交易的 有效性 , 通过 交易中 解锁 脚本
14、去 验证交易中的输入是否是有效的。这 其中 正是使用了 ECDSA算法 来验证。 假如 Alice需要对一个 信息进行签名, Bob需要 使用 Alice的公钥来验证 这个 信息。Alice和 Bob都使用的是同一个参数相同的椭圆曲线函数 。 ECDSA作用 在的是 信息的 hash值 上的,且这个值是被 截取 后的 使得 其大小与 这个 曲线的子集的阶 一致 。将 这个截取后的 hash值 定义为 z 图 8 算法 的 流程 是 1. Alice随机选择 一个 随机数 k (k n),作为 本次 加密的临时 私钥, 并 对需要签名的信息作 hash处理得到 z。计算 P = kG并 将 =
15、作为 临时 公钥 ,若r = 0则 重新选择 。 2. 计算 = 1(+), 是 Alice使用的私钥, 1是 k关于 n的模 逆 ,如果 s为 0则重新 选择 k再次 计算。 将 (r,s)作为 签名信息 3. Bob此时 有了 Alice的公钥 和 签名信息 (r,s), 首先计算 1 = 1 2 = 1 4. 然后 在计算 = 1 +2 如果 = , 则可以判定 这个 信息是来自于 Alice的 ( 3) 算法 的正确性 证明 从验证 的步骤往前回溯有 = 1 +2= 1 +2= (1 +2)将 1和 2的 等式带入 得到 = (1 +2)= (1+1)= 1(+)因为对于 基点 G来说
16、 它的阶为 n,因此为了 简洁,可以省去 mod n 由 模 逆 运算的 性质可以将 = 1(+) 改写 为 = 1(+)于是有 = 1(+)= 可以 看出此式正是 通过 随机数 k生成 点 P的 运算,回溯到了最开始的计算,可以验证算法的正确性 ( 4) 算法 的漏洞 在 Console Hacking 2010大会 上 ,黑客披露 了 一个 Sony PS3的 关于 ECSDA的 一个破解方式 。造成 这个漏洞的原因 在 于 PS3 在 ECSDA算法 中未 随机 的选择数字 k用来 生成点 P,从而 造成私钥泄露。 在此处键入公式。 假设 我们 有 两 笔 使用相同 k值签名 的信息 , 这两笔 信息 的 hash为 (1,2), 他们的 签名信息为 (1,1)和 (2,2) 首先 他们 的 1 = 2, 因为 k值 相同 考虑 (1 2) = 1(1 2) 将 两边同时乘以 k, (1 2) = (1 2) 两边 同时除以 (1 2)得到 = (1 2)(1 2)1 上面的最后 一个 式子我们 可以 计算得 到 k, 从这个确定的 k可以 计算 得出私钥 = 1( +) = 1( ) 从上述分析 可以看出 相同 k是 可以导致私钥泄露的 所以 随机数 k在 ECSDA算法 中扮有重要角色 , 如果在比特币的交易中