素域椭圆曲线secp192k1与secp256k1的快速约减求模算法完整推导

素域椭圆曲线secp192k1的素数P生成公式为:

p192 = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1

素域椭圆曲线secp256k1的素数P生成公式为:

p256 = 2^256 − 2^32 − 2^9  − 2^8 − 2^7 − 2^6 − 2^4 − 1

这个两个素数都是被精心设计计算出来的,使之具有相同的快速约减机制。将此类素数再进行简化,以:

P = 2^W - M

形式表达,对于secp192k1,则有:

W = 192
M = 0x1000011c9

对于secp256k1,则有

W = 256
M = 0x1000003d1

设大整数N数值范围为: 0 < N < 2^(W + 64)
现以 W + 64 二进制位长存储此大整数,每个存储单元位长为64位,
设其最高单元为H,可以很容易推导出:H * P < N < (H + 2) * P
进而推导可知:
若要计算:N mod P
要么是:N - (P * H)
要么是:N - (P * (H + 1))
绝无另外的可能!

由素数P的生成公式 P = 2^W - M 可知:

P * H = 2^W * H - H * M

计算N - P * H就非常简单了:

N - P * H = N - (2^W * H) + H * M

注意上面式中的N - (2^W * H)部分,这等效于把最高单元H清零!
所以计算 N - P * H 就简化为大整数N去掉最高单元H后剩下的W位二进制整数,再加上 H * M 就可以了。

这里可能有人会问,H * M 的有效位可能高达97位,会不会导致加法运算完成之后,原本是已经清零的最高单元H又变得不是零了呢?当然可能,若 N - P * H 的运算的最终结果使得最高单元H大于零,意味着我们所求的N mod P的数值应该是 N - (P * (H + 1)),只需要在计算 N - P * H 结果的基础上再减去一个素数P就可以了,等效运算则是直接忽略最高单元H,加上一个M就完成了。

在具有高速乘法器的处理器上,类似此种素域椭圆曲线的快速约减求模运算速度将超越使用矩阵加法形式快速约减的NIST类型素域椭圆曲线。此前有传言称比特币选用secp256k1而不是NIST的256素域椭圆曲线是担心NIST素域椭圆曲线参数有后门云云,在我看完全不是这么回事,别忘了所有这些曲线参数全都是Certicom搞的,从硬件实现上来讲,2^W - M形式的素数P能把x64、GPU、DSP的高速乘法器用到极致,而NIST类型快速约减算法在FPGA/ASIC上无出其右,因此个人认为比特币是为了更适应云计算环境而选用了secp256k1而不是NIST256v1,顺便提一句,NIST256v1在sec的文档中叫secp256r1,和secp256k1一起是唯二的256位素域椭圆曲线推荐。

转载于:https://my.oschina.net/safedead/blog/1541809

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值