从Curve25519规范中,我了解到可以随机选取32个字节,只需几个操作就可以在曲线上完成:
要生成32字节的Curve25519密钥,首先从密码安全源生成32个秘密随机字节:
mysecret[0], mysecret[1], ..., mysecret[31].那就去做
mysecret[0] &= 248;
mysecret[31] &= 127;
mysecret[31] |= 64;是否有类似的方法来获取随机字节并将其用于p-256私钥?
发布于 2018-03-16 20:14:13
NISTP-256密钥(用于ECDH或ECDSA)表示\ell = 2^{256} - 2^{224} + 2^{192} - 89188191075325690597107910205041859247,的任意标量模D1,而X25519密钥表示2^{254}和2^{255}之间的整数倍数为8的整数倍,在这两种情况下都被解释为p_1 = 2^{252} + 27742317777372353535851937790883648493.的标量模8 p_1,在这两种情况下,应该从所有可能性中一致地随机选择密钥,使每种可能性都具有相同的概率。这里,\ell和p_1都是大素数,是各自曲线上标准基点的阶数。
NIST建议,在FIPS 186-4附录B.4第61至64页中,要么随机生成320位,减少模\ell - 1,再添加1;要么做拒绝采样,绘制256位n,然后重新开始,除非0 < n < \ell。这些方法分别保持了模偏置的小或不存在,避免了n = 0。这个可以忽略不计的好处,所以我只接受模数偏差,即随机选择256位,执行一次条件减法,损失的理论安全性还不到一位。但是如果你使用的是NISTP-256,你可能是遵从政府官僚标准的奴隶,所以你应该遵循标准的字母。
Technical详细信息,或者,为什么NISTP-256和X25519上的ECDH不同?
曲线组NISTP-256具有素数阶\ell,标准基点生成整个组,因此即使你揭示了攻击者控制点的[n]P,其中n是你的秘密标量,NISTP-256上也不可能有主动小子群攻击;虽然NISTP-256的二次扭曲不具有素数,但它恰好有适度的协因子34905 = 3 \cdot 5 \cdot 13 \cdot 179,它赋予了扭曲安全性的程度。警告:如果你愚蠢地处理未压缩的(x, y)输入,扭曲安全性是不够的;您仍然必须验证它们以阻止无效的曲线攻击。
相反,曲线群Curve25519具有复合阶8 p_1,其扭曲度对另一个大素数p_2具有复合阶4 p_2,而标准基点具有阶p_1。因此,为了在不需要点验证的情况下阻止小子群和扭转攻击,总是选择秘密标量n与零模余因子8和扭余因子4一致,公钥仅作为x坐标传输,因此唯一可能的无效曲线是二次扭曲。
https://crypto.stackexchange.com/questions/56509
复制相似问题