本工程设计ModExpPowering为顶层模块,通过一包含11个状态的有限状态机(NONE 1, LOADC 2, WAIT_COMPUTE 3, CALC_C_BAR 4, GET_K_D 5, BIGLOOP 6, CALC_SQUARE 7, CALC_M_BAR_1 8, COMPLETE 9, OUTPUT_RESULT 10, TERMINAL 11) 来调度数据的存取,模乘计算与循环(从i=0至i=32-1),以及结果组合输出。其安全性的考量不是完全消除判断语句,而是在于不管密钥位为0或1都会进行相同的运算过程,从而让功耗分析攻击失效。
模块代码中先例化了四个存储模块与一个MonPro模块,接着进入状态机部分;
LOADC:
在LOADC状态存入分为32组64位的2048位数据;下一个状态是WAIT_COMPUTE,在该状态处等待startCompute信号到来即进入CALC_C_BAR;
在CALC_C_BAR处计算
c_bar = MonPro(c, t)
以及赋值
m_bar=r
然后转入GET_K_D,在该状态记录私钥d每组最左边的非零位数,用k_d1, k_d2表示。
BIGLOOP:
实k_现循环i从k_d1* 64+ k_d2至0 ,计算两个重要判断条件用参数:
b = 1 - d_in[k_d1][k_d2];
b2 = d_in[k_d1][k_d2];
然后根据b是否为0把MonPro(m_bar, c_bar)赋值给m_bar或c_bar。
CALC_SQUARE:
根据b2是否为0计算MonPro(m_bar, m_bar)或者MonPro(c_bar, c_bar) 直到k_d0为止循环被BIGLOOP所调用;
否则进入CALC_M_BAR_1。
CALC_M_BAR_1:
计算
M=MonPro(m_bar, 1)
得到模幂
输出结果
curton 2020-8-26 22:06
abner_ma 2020-8-26 19:43