我正在编写一个同时需要加密/解密和签名/验证的应用程序,我选择X25519作为密钥协商算法(它将产生密钥用于加密),并选择ECDSA来签名消息。
密钥生成:我从助记符生成一个curve25519私钥(所以我有一个随机的32字节私钥)。
现在我有了32个字节数组,我想使用这个数组字节数组进行加密和签名,我遇到的问题是,对于X25519,我需要为这个私钥应用密钥夹紧才能有效,如下所示:
privateKey[0] &= 248; // unset the 3 least significant bits
privateKey[31] &= 127 // unset the most significant bit
privateKey[31] |= 64 // set the second most significant bit但是对于ECDSA,键需要在[1, N]范围内,其中N(对于curve25519)等于2^{252} +一个小因子,所以我需要将我的32字节数组转换成适合这个范围的数字。
我有几个问题:
发布于 2022-02-04 10:52:25
为什么X25519私钥不需要适合范围[1,N]?
通过取消最重要位和最不重要位的设置,您可以将密钥限制为仅252位。当你说N是2^{252} +一个小因子的时候,你说的是x25519使用的子群的顺序,而不是曲线组的全部顺序。这个子群有指数(或协因子) 8。不设置三个较低的位迫使秘密为8的倍数,这意味着它将位于这个大素数级子群中。
另外,为什么将X25519中使用的键夹紧功能应用于用于ECDSA的密钥并不重要?
据我所知,Curve25519不用于ECDSA。你是说EdDSA (特别是ed25519)吗?
https://crypto.stackexchange.com/questions/98510
复制相似问题