secp256k1算法详解四的关键点补充说明是什么?

摘要:本文对secp256k1算法中的量级以及规范化概念又做了进一步深入分析,之后还对算法中最新的模逆求解算法进行了详细分析。
1magnitude及normalized 由于当前许多项目都用到secp256k1库,比特币作为体量最大的数字货币项目,这里建议直接参考bitcoin-core提供的最新secp256k1源码。仍以field的10x26实现版本为例,相关定义如下: /** This field implementation represents the value as 10 uint32_t limbs in base * 2^26. */ typedef struct { /* A field element f represents the sum(i=0..9, f.n[i] << (i*26)) mod p, * where p is the field modulus, 2^256 - 2^32 - 977. * * The individual limbs f.n[i] can exceed 2^26; the field's magnitude roughly * corresponds to how much excess is allowed. The value * sum(i=0..9, f.n[i] << (i*26)) may exceed p, unless the field element is * normalized. */ uint32_t n[10]; /* * Magnitude m requires: * n[i] <= 2 * m * (2^26 - 1) for i=0..8 * n[9] <= 2 * m * (2^22 - 1) * * Normalized requires: * n[i] <= (2^26 - 1) for i=0..8 * sum(i=0..9, n[i] << (i*26)) < p * (together these imply n[9] <= 2^22 - 1) */ SECP256K1_FE_VERIFY_FIELDS } secp256k1_fe; 对于magnitude,可称其为“量级”,当m=0时,这时n[i] <= 0(i=0...9),由此可知此时secp256k1_fe大数必为0,当m=1时,n[i] <= 2*(2^26 - 1)对于i=0...8,n[9] <= 2*(2^22 - 1),有些说法是当m=1时,是将大数限制到[0,到2p)范围内,这是不准确的,此时secp256k1_fe大数范围是[0, 2*(2^256-1)](上限是稍大于2p的),magnitude设计本质是“存储约束”而非“模p范围”,通过magnitude约束将大数控制在可高效约简的范围内,magnitude表示大概是2m个p的量级。 对于normalized,可称其为“规范化(归一化)”,从注释中可知每个n[i]都小于或等于其对应的MASK,且sum(n[i]) < p,即规范化后的大数是[0, p)之内的数。由此可知规范化的大数一定是magnitude为0或1的数,但是magnitude为1的数不一定是规范化的大数。 函数secp256k1_fe_normalize对大数实现规范化操作,其本质是将大数看作为特殊的2^26进制大数,即N=∑ni*wi,这里ni <= 2 * m * (2^26 - 1) for i=0..8,n9 <= 2 * m * (2^22 - 1),wi=2^(i*26),之所以说它特殊,是因为由于m的存在,每个位上数值是可以大于或等于基数2^26的(正常情况下每个位上取值小于基数,如10进制数,每个位上数值都小于基数10,另外最高位取值有特殊限制),在secp256k1_fe_normalize函数中有两部分操作,第一部分先将大数A规范为最多为257位的大数B(m确定时,该数对应确定最大值,后续详解),第二部分将大数B规范为小于模数p的大数。 在secp256k1源码中其实定义了各个参数大数中magnitude的最大值,在定义VERIFY宏时会对参数合法性进行检查。
阅读全文