特殊素数及快速模约简

梅森数

形如 M p = 2 p − 1 M_p=2^p-1 Mp=2p1的数称为梅森数,其中 p p p是素数。

如果梅森数是素数,称为梅森素数。目前仅发现51个梅森素数。前十个为:

序号幂次 p p p梅森素数 M p M_p Mp
123
237
3531
47127
5138191
617131071
719524287
8312147483647
9612305843009213693951
1089618970019642690137449562111

广义梅森素数

梅森素数的除法和取模运算很快,因为它与2的幂次 2 p 2^p 2p距离为1。

但是梅森素数的数量是在太少,而且其大小对于加密算法来说不合适(大了运算慢,小了不安全)。于是,人们寻找广义梅森素数,形如 p = 2 n − m p = 2^n-m p=2nm,其中 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=2192232212282726231
其中 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=225623229282726241
其中 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=2nm,令 0 ≤ c < p 2 0 \le c < p^2 0c<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:=ckppc
于是
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==ck(2nm)(ck2n)+km
计算 k ′ ← ⌊ c / 2 n ⌋ k' \leftarrow \lfloor c/2^n \rfloor kc/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&((1n)1))+(cn)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=219226412224296122562224+2192+296123842128296+232125211
最后一个是梅森素数。前4个素数在 32 32 32位机器上运算很快。

对于 p 192 p_{192} p192,令 0 ≤ c < p 2 0 \le c < p^2 0c<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} 2320225621922128+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),那么连续做数次减法。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值