椭圆曲线
加密算法 具有一个特征, 正向容易,逆向困难
比如 RSA, 基于大整数因子分解难题 , 大致理解如下:
y = x ∗ k y=x * k y=x∗k
正向: 已知 x 和 k, 求解 y。 非常容易
逆向: 已知 y, 将 y 质因式分解成 x 和 k。非常困难
比如 ECC, 基于离散对数求解难题, 大致理解如下:
y = log x k y = \log_{x} {k} y=logxk
正向: 已知 x 和 k, 求解 y。 非常容易
逆向: 已知 y和x, 求解
k
=
log
x
y
k = \log_{x} {y}
k=logxy。 非常困难
RSA key size (bits) | ECC key size (bits) |
---|---|
1024 | 160 |
2048 | 224 |
3072 | 256 |
7680 | 384 |
y
2
=
x
3
+
a
x
+
b
y^2 = x^3 + a x + b
y2=x3+ax+b
4
a
3
+
27
b
2
≠
0
4a^3 + 27b^2 \neq 0
4a3+27b2=0
椭圆曲线在线画图
y
2
=
x
3
+
7
椭圆曲线
y^2 = x^3 + 7 椭圆曲线
y2=x3+7椭圆曲线
看到该曲线,一脸懵逼,咋就成为数据加密的基石;深入了解发现,椭圆曲线加密有两点比较重要,第一点 加密是基于群论分析的, 第二点 计算机只能处理整数,是离散的。
群论 | 整数 |
---|
在数学中,群(group)是由一种集合以及一个二元运算所组成的代数结构,并且符合“群公理”。群公理包含下述四个性质,分别是封闭性、结合律、单位元和对于集合中所有元素存在逆元素。
- 封闭性
若 a ∈ G , b ∈ G ,那么 a ⋅ b ∈ G 若 a \in \mathbb{G} , b \in \mathbb{G}, 那么 a \cdot b \in \mathbb{G} 若a∈G,b∈G,那么a⋅b∈G - 结合性
( a ⋅ b ) ⋅ c = a ⋅ ( b ⋅ c ) (a \cdot b )\cdot c = a \cdot (b \cdot c) (a⋅b)⋅c=a⋅(b⋅c) - 单位元
存在单位元 e ,使得 a ⋅ e = a ⋅ e = a 存在单位元 e, 使得 a\cdot e=a\cdot e=a 存在单位元e,使得a⋅e=a⋅e=a - 逆元
对于任意 a ∈ G ,存在 b ∈ G ,使得 a ⋅ b = e ,则 a 和 b 互为逆元,记 a = b − 1 , b = a − 1 对于任意 a \in \mathbb{G},存在 b \in \mathbb{G},使得 a \cdot b = e,则a 和b 互为逆元, 记 a=b^{-1} , b=a^{-1} 对于任意a∈G,存在b∈G,使得a⋅b=e,则a和b互为逆元,记a=b−1,b=a−1
- 交换律
a ⋅ b = b ⋅ a a \cdot b = b \cdot a a⋅b=b⋅a
整数集 就是一个阿贝尔群, 单位元是 0;
椭圆曲线集合做一个扩充,引入一个“特殊”的点,这个点叫“无穷远点”,记作
∞
\infty
∞,当作单位元; 椭圆曲线上的阿贝尔群定义。 证明可参考这篇文章
因为
P
⋅
Q
⋅
R
=
∞
P \cdot Q \cdot R = \infty
P⋅Q⋅R=∞
R
⋅
−
R
⋅
∞
=
∞
R \cdot -R \cdot \infty = \infty
R⋅−R⋅∞=∞
那么
P
⋅
Q
⋅
R
=
R
⋅
−
R
=
>
P
⋅
Q
=
−
R
P \cdot Q \cdot R = R \cdot -R => P \cdot Q = - R
P⋅Q⋅R=R⋅−R=>P⋅Q=−R
基于P 的切线与椭圆曲线的交点的逆元为
R
1
(
2
P
)
R_{1}(2P)
R1(2P)
P
⋅
P
=
R
1
P \cdot P = R_{1}
P⋅P=R1
基于P和
R
1
R_{1}
R1的直线与椭圆曲线的交点的逆元为
R
2
(
3
P
)
R_{2}(3P)
R2(3P)
P
⋅
R
1
=
R
2
=
>
P
⋅
2
P
=
R
2
P \cdot R_{1}= R_{2} => P \cdot 2P = R_{2}
P⋅R1=R2=>P⋅2P=R2
基于P和
R
2
R_{2}
R2的直线与椭圆曲线的交点的逆元为
R
3
(
4
P
)
R_{3}(4P)
R3(4P) 或 基于
R
1
(
2
P
)
R_{1}(2P)
R1(2P) 的切线与椭圆曲线的交点的逆元为
R
3
(
4
P
)
R_{3}(4P)
R3(4P)
P
⋅
R
2
=
R
3
=
>
P
⋅
3
P
=
R
3
P \cdot R_{2}= R_{3} => P \cdot 3P = R_{3}
P⋅R2=R3=>P⋅3P=R3
R
1
⋅
R
1
=
R
3
=
>
2
P
⋅
2
P
=
R
3
R_{1} \cdot R_{1}= R_{3} => 2P \cdot 2P = R_{3}
R1⋅R1=R3=>2P⋅2P=R3
那么对于基点
G
\mathbb{G}
G,乘法定义
Q
=
k
G
Q = k \mathbb{G}
Q=kG
对于计算机,更希望研究整数,即针对有限域 F \mathbb{F} F的离散数学; 对此,非常佩服密码学家的想象力,将点收敛到某个素数 p p p的有限域 F p \mathbb{F}_{p} Fp (⚠️ ≡ \equiv ≡ 符号表示 “同余")
{ ( x , y ) ∈ F p 2 ∣ y 2 ≡ x 3 + a x + b ( m o d p ) , ( 4 a 3 + 27 b 2 ≢ 0 ( m o d p ) ) } ∪ { ∞ } \left\{ (x,y) \in \mathbb{F}_{p}^2 \mid y^2 \equiv x ^3 + ax + b \pmod{p} ,(4a^3 + 27b^2 \not\equiv 0 \pmod{p}) \right\} \cup \left\{ \infty \right\} {(x,y)∈Fp2∣y2≡x3+ax+b(modp),(4a3+27b2≡0(modp))}∪{∞}
那么已知
Q
和
G
Q和G
Q和G 求解
k
k
k难度更加困难,因为存在
n
P
=
∞
nP = \infty
nP=∞
Q
=
k
G
Q = k \mathbb{G}
Q=kG
即
1 P 1P 1P | 2 P 2P 2P | 3 P 3P 3P | 4 P 4P 4P | … | n P = ∞ nP = \infty nP=∞ |
---|---|---|---|---|---|
( n + 1 ) P = 1 P (n+1)P=1P (n+1)P=1P | ( n + 2 ) P = 2 P (n+2)P=2P (n+2)P=2P | ( n + 3 ) P = 3 P (n+3)P=3P (n+3)P=3P | ( n + 4 ) P = 4 P (n+4)P=4P (n+4)P=4P | … | ( n + n ) P = ∞ (n+n)P=\infty (n+n)P=∞ |
( 2 n + 1 ) P = 1 P (2n+1)P=1P (2n+1)P=1P | ( 2 n + 2 ) P = 2 P (2n+2)P=2P (2n+2)P=2P | ( 2 n + 3 ) P = 3 P (2n+3)P=3P (2n+3)P=3P | ( 2 n + 4 ) P = 4 P (2n+4)P=4P (2n+4)P=4P | … | ( 2 n + n ) P = ∞ (2n+n)P=\infty (2n+n)P=∞ |
这样的集合称之为循环子群, n n n为该子群阶, P P P是子群的基点。
有限域 F p \mathbb{F}_{p} Fp群的阶是群中元素的个数,Schoof算法快速求解。子群的阶一定是父群阶的一个因子。假设父群的阶是N,子群的阶是n,那么h=N/n一定是一个整数,h被称为子群的余因子
因此,对于椭圆曲线加密算法, G , a , b , p , n , h \mathbb{G},a,b,p,n,h G,a,b,p,n,h 参数是确定的
SM2
p = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF
a = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC
b = 0x28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93
xG = 0x32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7
yG = 0xBC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0
n = 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123
h = 1
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0
b = 7
xG = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
yG = 0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
h = 1
参考
通俗易懂一些 https://www.jianshu.com/p/5b04b66a55a1
深入理解一些 https://www.cnblogs.com/math/p/discrete-log.html
详细一些 https://www.ruanx.net/elliptic-curve/
外文推荐阅读 https://andrea.corbellini.name/2015/05/17/elliptic-curve-cryptography-a-gentle-introduction/