梅森数
形如 M p = 2 p − 1 M_p=2^p-1 Mp=2p−1的数称为梅森数,其中 p p p是素数。
如果梅森数是素数,称为梅森素数。目前仅发现51个梅森素数。前十个为:
序号 | 幂次 p p p | 梅森素数 M p M_p Mp |
---|---|---|
1 | 2 | 3 |
2 | 3 | 7 |
3 | 5 | 31 |
4 | 7 | 127 |
5 | 13 | 8191 |
6 | 17 | 131071 |
7 | 19 | 524287 |
8 | 31 | 2147483647 |
9 | 61 | 2305843009213693951 |
10 | 89 | 618970019642690137449562111 |
广义梅森素数
梅森素数的除法和取模运算很快,因为它与2的幂次 2 p 2^p 2p距离为1。
但是梅森素数的数量是在太少,而且其大小对于加密算法来说不合适(大了运算慢,小了不安全)。于是,人们寻找广义梅森素数,形如 p = 2 n − m p = 2^n-m p=2n−m,其中 m m m是较小的数字。
椭圆曲线
s
e
c
p
192
k
1
secp192k1
secp192k1选取:
p
192
=
2
192
−
2
32
−
2
12
−
2
8
−
2
7
−
2
6
−
2
3
−
1
p_{192} = 2^{192} - 2^{32} - 2^{12} - 2^8 - 2^7 - 2^6 - 2^3 - 1
p192=2192−232−212−28−27−26−23−1
其中
n
=
192
,
m
=
0
x
1000011
c
9
n=192,\, m=0x1000011c9
n=192,m=0x1000011c9
椭圆曲线
s
e
c
p
256
k
1
secp256k1
secp256k1选取:
p
256
=
2
256
−
2
32
−
2
9
−
2
8
−
2
7
−
2
6
−
2
4
−
1
p_{256} = 2^{256} - 2^{32} - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
p256=2256−232−29−28−27−26−24−1
其中
n
=
256
,
m
=
0
x
1000003
d
1
n=256,\, m=0x1000003d1
n=256,m=0x1000003d1
对于 p = 2 n − m p=2^n-m p=2n−m,令 0 ≤ c < p 2 0 \le c < p^2 0≤c<p2,计算 c m o d p c \mod p cmodp
易知
c
m
o
d
p
=
c
−
k
⋅
p
k
:
=
⌊
c
p
⌋
\begin{aligned} c \mod p =& c - k \cdot p\\ k :=& \lfloor \frac{c}{p} \rfloor\\ \end{aligned}
cmodp=k:=c−k⋅p⌊pc⌋
于是
c
m
o
d
p
=
c
−
k
⋅
(
2
n
−
m
)
=
(
c
−
k
⋅
2
n
)
+
k
⋅
m
\begin{aligned} c \mod p =& c - k \cdot (2^n-m)\\ =& (c - k \cdot 2^n) + k \cdot m \end{aligned}
cmodp==c−k⋅(2n−m)(c−k⋅2n)+k⋅m
计算
k
′
←
⌊
c
/
2
n
⌋
k' \leftarrow \lfloor c/2^n \rfloor
k′←⌊c/2n⌋作为
k
k
k(
k
′
k'
k′偏小,相对偏移
m
2
n
\dfrac{m}{2^n}
2nm)
那么
c
m
o
d
p
=
(
c
&
(
(
1
≪
n
)
−
1
)
)
+
(
c
≫
n
)
⋅
m
c \mod p = (c \& ((1 \ll n)-1)) + (c \gg n) \cdot m
cmodp=(c&((1≪n)−1))+(c≫n)⋅m
计算结果范围是
[
0
,
(
m
+
1
)
2
n
)
[0,(m+1)2^n)
[0,(m+1)2n)
如果位于 [ p , ( m + 1 ) 2 n ) [p,(m+1)2^n) [p,(m+1)2n),那么再次执行上述流程。
NIST素数
在NIST发布的素域椭圆曲线的公开文档中,给出了一些素数:
p
192
=
2
192
−
2
64
−
1
p
224
=
2
224
−
2
96
−
1
p
256
=
2
256
−
2
224
+
2
192
+
2
96
−
1
p
384
=
2
384
−
2
128
−
2
96
+
2
32
−
1
p
521
=
2
521
−
1
\begin{aligned} p_{192} =& 2^{192}-2^{64}-1\\ p_{224} =& 2^{224}-2^{96}-1\\ p_{256} =& 2^{256}-2^{224}+2^{192}+2^{96}-1\\ p_{384} =& 2^{384}-2^{128}-2^{96}+2^{32}-1\\ p_{521} =& 2^{521}-1\\ \end{aligned}
p192=p224=p256=p384=p521=2192−264−12224−296−12256−2224+2192+296−12384−2128−296+232−12521−1
最后一个是梅森素数。前4个素数在
32
32
32位机器上运算很快。
对于 p 192 p_{192} p192,令 0 ≤ c < p 2 0 \le c < p^2 0≤c<p2,计算 c m o d p c \mod p cmodp
c
c
c可以写成
6
6
6个
64
64
64比特整数:
c
=
c
5
2
320
+
c
4
2
256
+
c
3
2
192
+
c
2
2
128
c
1
2
64
+
c
0
c = c_52^{320}+c_42^{256}+c_32^{192}+c_22^{128}c_12^{64}+c_0
c=c52320+c42256+c32192+c22128c1264+c0
简记为数组
[
c
5
,
c
4
,
c
3
,
c
2
,
c
1
,
c
0
]
[c_5,c_4,c_3,c_2,c_1,c_0]
[c5,c4,c3,c2,c1,c0]
而
2
320
≡
2
128
+
2
64
+
1
m
o
d
p
2
256
≡
2
128
+
2
64
m
o
d
p
2
192
≡
2
64
+
1
m
o
d
p
\begin{aligned} 2^{320} \equiv& 2^{128}+2^{64}+1 \mod p\\ 2^{256} \equiv& 2^{128}+2^{64} \mod p\\ 2^{192} \equiv& 2^{64}+1 \mod p\\ \end{aligned}
2320≡2256≡2192≡2128+264+1modp2128+264modp264+1modp
于是
c
m
o
d
p
=
[
c
5
,
c
5
,
c
5
]
+
[
c
4
,
c
4
,
0
]
+
[
0
,
c
3
,
c
3
]
+
[
c
2
,
c
1
,
c
0
]
\begin{aligned} c \mod p =& [c_5,c_5,c_5]\\ +& [c_4,c_4,0]\\ +& [0,c_3,c_3]\\ +& [c_2,c_1,c_0]\\ \end{aligned}
cmodp=+++[c5,c5,c5][c4,c4,0][0,c3,c3][c2,c1,c0]
即
4
4
4个
192
192
192比特的数相加,它的范围
[
0
,
4
p
)
[0,4p)
[0,4p)
如果结果位于 [ p , 4 p ) [p,4p) [p,4p),那么连续做数次减法。