区块链中的数学 – 椭圆曲线加密原理和实例演练

本节将介绍如何使用离散域上椭圆曲线进行加密和解密过程。若果觉得阅读理解本文有困难,可以先参考之前的一些铺垫的历史文章。以后所说的椭圆曲线默认都是指离散域上模素数的椭圆曲线

## 写在前面 上一节我们介绍了[离散域上的椭圆曲线运算和安全性原理](https://learnblockchain.cn/article/1549),有了这些基础,本节将介绍如何使用离散域上椭圆曲线进行加密和解密过程。若果觉得阅读理解本文有困难,可以先参考之前的一些铺垫的历史文章。以后所说的椭圆曲线默认都是指**离散域上模素数的椭圆曲线**。 ## 加密原理和流程 利用上一节的知识,在模?(p是非常大的素数)有限域上,使用椭圆曲线来进行加密和解密也是与RSA一定程度的类似(*后续会有专门文章讲解RSA*),每一个用户都有属于自己的公钥和私钥。私钥就是用户选定的数字?(实际算法中是随机数生成器随机生成的不可预测的一个值),私钥自己秘密保存;公钥就是由?=??(G是选定的生成元),计算出来的点,公钥对外公开。 总结一下:**私钥是一个不公开的数字,公钥是椭圆曲线上的一个点**。 假定A与B进行加密通信,其加密的流程如下: (1)A首先将明文消息转换(编码)为$E_p(?,?)$中的$P_m(?,?)$,然后随机选定一个正整数?(同样由随机数生成器产生),并且利用B的公钥$P_B$, 按如下计算出密文: $C_m={??,P_m+?P_B}$ 因此,密文实际上是有两个点组成。 (2)B收到密文$C_m$,利用自己的私钥$n_B$进行如下计算,可以解密得到明文: $P_m+?P_B−n_B(??)=P_m+?(n_B?)−n_B(??)=P_m+?(n_B?)−kn_B(?)=P_m$ 上式中,用到了点乘法交换律: $?(n_B?)=n_B(k?)$ 解密过程简单说也就是,(1)中产生的密文中,第二个点$P_m+?P_B$减去第一个点??与自己的私钥?之积。 同理,B加密信息发送给A,A解密过程也是如此。大家不妨自己构思下。 ## 实例演练 椭圆曲线方程中的参数(不了解椭圆曲线方程参考[上一篇](https://learnblockchain.cn/article/1549))选定为:?=0, ?=−4,?=199,?=(2,2),该椭圆曲线方程为: $y^2=x^3−4$ 假设B选定的私钥为$n_B=113$,其公钥: $P_B=113?=(192,161)$ A希望将消息$P_m=(88,57)$(*注:一般完整的使用场景是一段文字先转化为椭圆曲线上的点,转化的方法可以有多种,后续如有需要可以单独介绍,这里直接使用转化的点举例,便于说明*) 加密后发送给B,于是A随机选定正整数?=103,并通过B的公钥加密得到密文: $C_m=\{103(2,2),(88,57)+103(192,161)\}=\{(96,66),(124,70)\}$ B收到密文消息后,利用自己的私钥$n_B=119$进行解密: $P_m+?P_B−n_B(??)=(124,70)−113(96,66)=(124,70)−(190,62)=(88,57)=P_m$. 注意:这里的‘+’ 是模p的点加运算,之前介绍过。 到这里,B顺利解密得到明文消息,A与B之间成功完成加密通信。需要说明的是,这里是椭圆曲线参数选取比较小,便于计算和理解,实际选择是非常大的整数,提高安全性。 大家可以看下实际椭圆曲线算法(英文简称:ECC)参数,p,g,n非常巨大。 ECC推荐参数:256k1 `p=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F a=0000000000000000000000000000000000000000000000000000000000000000 b=0000000000000000000000000000000000000000000000000000000000000007 G=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8 n=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141`———————————————— 下一节讲[椭圆曲线的签名及其验证过程](https://learnblockchain.cn/article/1551)。 欢迎关注公众号:blocksight

写在前面

上一节我们介绍了离散域上的椭圆曲线运算和安全性原理,有了这些基础,本节将介绍如何使用离散域上椭圆曲线进行加密和解密过程。若果觉得阅读理解本文有困难,可以先参考之前的一些铺垫的历史文章。以后所说的椭圆曲线默认都是指离散域上模素数的椭圆曲线

加密原理和流程

利用上一节的知识,在模?(p是非常大的素数)有限域上,使用椭圆曲线来进行加密和解密也是与RSA一定程度的类似(后续会有专门文章讲解RSA),每一个用户都有属于自己的公钥和私钥。私钥就是用户选定的数字?(实际算法中是随机数生成器随机生成的不可预测的一个值),私钥自己秘密保存;公钥就是由?=??(G是选定的生成元),计算出来的点,公钥对外公开。

总结一下:私钥是一个不公开的数字,公钥是椭圆曲线上的一个点

假定A与B进行加密通信,其加密的流程如下:

(1)A首先将明文消息转换(编码)为$E_p(?,?)$中的$P_m(?,?)$,然后随机选定一个正整数?(同样由随机数生成器产生),并且利用B的公钥$P_B$, 按如下计算出密文:

$C_m={??,P_m+?P_B}$

因此,密文实际上是有两个点组成。

(2)B收到密文$C_m$,利用自己的私钥$n_B$进行如下计算,可以解密得到明文:

$P_m+?P_B−n_B(??)=P_m+?(n_B?)−n_B(??)=P_m+?(n_B?)−kn_B(?)=P_m$

上式中,用到了点乘法交换律:

$?(n_B?)=n_B(k?)$

解密过程简单说也就是,(1)中产生的密文中,第二个点$P_m+?P_B$减去第一个点??与自己的私钥?之积。

同理,B加密信息发送给A,A解密过程也是如此。大家不妨自己构思下。

实例演练

椭圆曲线方程中的参数(不了解椭圆曲线方程参考上一篇)选定为:?=0, ?=−4,?=199,?=(2,2),该椭圆曲线方程为:

$y^2=x^3−4$

假设B选定的私钥为$n_B=113$,其公钥:

$P_B=113?=(192,161)$

A希望将消息$P_m=(88,57)$(注:一般完整的使用场景是一段文字先转化为椭圆曲线上的点,转化的方法可以有多种,后续如有需要可以单独介绍,这里直接使用转化的点举例,便于说明) 加密后发送给B,于是A随机选定正整数?=103,并通过B的公钥加密得到密文:

$C_m={103(2,2),(88,57)+103(192,161)}={(96,66),(124,70)}$

B收到密文消息后,利用自己的私钥$n_B=119$进行解密:

$P_m+?P_B−n_B(??)=(124,70)−113(96,66)=(124,70)−(190,62)=(88,57)=P_m$.

注意:这里的‘+’ 是模p的点加运算,之前介绍过。

到这里,B顺利解密得到明文消息,A与B之间成功完成加密通信。需要说明的是,这里是椭圆曲线参数选取比较小,便于计算和理解,实际选择是非常大的整数,提高安全性。

大家可以看下实际椭圆曲线算法(英文简称:ECC)参数,p,g,n非常巨大。 ECC推荐参数:256k1

p=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F a=0000000000000000000000000000000000000000000000000000000000000000 b=0000000000000000000000000000000000000000000000000000000000000007 G=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8 n=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141————————————————

下一节讲椭圆曲线的签名及其验证过程。

欢迎关注公众号:blocksight

区块链技术网。

  • 发表于 2020-04-27 14:51
  • 阅读 ( 1107 )
  • 学分 ( 0 )
  • 分类:入门/理论

评论