256位NIST素域椭圆曲线快速约减算法x64编程实现研究(上)

这是按照从低到高排列的快速约减矩阵

|===|===|===|===|===|===|===|===|
|c00|c01|c02|c03|c04|c05|c06|c07|
|===|===|===|===|===|===|===|===|
|a00|a01|a02|a03|a04|a05|a06|a07|(=)
|---|---|---|---|---|---|---|---|
|   |   |   |a11|a12|a13|a14|a15|(+)
|   |   |   |a11|a12|a13|a14|a15|(+)
|---|---|---|---|---|---|---|---|
|   |   |   |a12|a13|a14|a15|   |(+)
|   |   |   |a12|a13|a14|a15|   |(+)
|---|---|---|---|---|---|---|---|
|a08|a09|a10|   |   |   |a14|a15|(+)
|a09|a10|a11|a13|a14|a15|a13|a08|(+)
|---|---|---|---|---|---|---|---|
|a11|a12|a13|   |   |   |a08|a10|(-)
|a12|a13|a14|a15|   |   |a09|a11|(-)
|a13|a14|a15|a08|a09|a10|   |a12|(-)
|a14|a15|   |a09|a10|a11|   |a13|(-)
|===|===|===|===|===|===|===|===|

说老实话,虽然最先接触的素域椭圆曲线就是这个,但是最先产生代码的反而是国密SM2的快速约减算法,原因无它,太不顺眼了,最初是想按照NIST建议的方式按行进行加减运算,没想到写起代码来要多别扭有多别扭,直到有一天接触到FPGA编程才发现这个算法实现方案根本就不是给通用x64处理器用的,它最适合的硬件是具备36位加法器的DSP或是直接搭建260位加法器的FPGA,要在通用x64处理器上实现,做一点等效变换是必要的。

构造如下6个组合数值,其值分别为:

K00 = a11 + a12 + a13
K01 = a12 + a13 + a14
K02 = a13 + a14 + a15
N00 = a08 + a09
N01 = a09 + a10
N02 = a10 + a11

用这6个组合数值再加上a14和a15这两个独立32位数值,重构快速约减矩阵如下:

|===|===|===|===|===|===|===|===|
|c00|c01|c02|c03|c04|c05|c06|c07|
|===|===|===|===|===|===|===|===|
|a00|a01|a02|a03|a04|a05|a06|a07|(=)
|---|---|---|---|---|---|---|---|
|   |   |   |K00|K01|K02|a14|a15|(+)
|   |   |   |K00|K01|K02|a14|a15|(+)
|   |   |   |a14|   |   |   |a15|(+)
|N00|N01|N02|   |   |   |K02|N00|(+)
|   |   |   |   |   |   |   |a15|(+)
|---|---|---|---|---|---|---|---|
|K00|K01|K02|K02|a14|a15|N00|N01|(-)
|a14|a15|   |N00|N01|N02|   |K00|(-)
|===|===|===|===|===|===|===|===|

总算顺眼了。顺便安排8个64位通用寄存器来存储这些数值:

r15 = a15
r14 = a14
r13 = a13 + a14 + a15
r12 = a12 + a13 + a14
r11 = a11 + a12 + a13
r10 = a10 + a11
r9  = a09 + a10
r8  = a08 + a09

从而得到最终的寄存器缓存数值优化方案,如果完全不考虑优化问题,其寄存器缓存数值本该如下:

r15 = a15
r14 = a14
r13 = a13
r12 = a12
r11 = a11
r10 = a10
r9  = a09
r8  = a08

由x64加法器的特性可知,即使是无优化的按列运算方案,也是优于按行运算方案的,这和384位NIST素域椭圆曲线快速约减算法的实现完全不同,后者按列运算是无论怎么优化也比不了按行运算快捷的,顺带猜测国密SM2素域椭圆曲线参数的设计者应该是主攻DSP和ASIC解决方案的,那个在通用x64处理器上也是按列运算胜出。


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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值