在零到莫内罗书中,我正在读关于Schnorr签名的文章。第2.3.4节从random32_unbiased()的src/crypto/crypto.cpp引用代码库函数。我的理解是,这个函数在1和l-1 (都包括在内)之间生成一个随机整数,其中l是一个大整数。
这一职能是:
void random32_unbiased(unsigned char *bytes)
{
// l = 2^252 + 27742317777372353535851937790883648493.
// l fits 15 times in 32 bytes (iow, 15 l is the highest multiple of l that fits in 32 bytes)
static const unsigned char limit[32] = { 0xe3, 0x6a, 0x67, 0x72, 0x8b, 0xce, 0x13, 0x29, 0x8f, 0x30, 0x82, 0x8c, 0x0b, 0xa4, 0x10, 0x39, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0 };
while(1)
{
generate_random_bytes_thread_safe(32, bytes);
if (!less32(bytes, limit))
continue;
sc_reduce32(bytes);
if (sc_isnonzero(bytes))
break;
}
}static const unsigned char limit[32]这条线有什么用途?
我的主要问题是上面的问题,但总的来说,我不太明白函数是如何工作的,所以解释一下也会很感激。
发布于 2021-07-23 16:59:57
Monero使用edwards25519作为底层椭圆曲线,用于生成EdDSA (Edwards数字签名),在Monero块链上创建事务。
edwards25519是一条复合级曲线,也就是说,它不是比特币使用的secp256k1那样的素数级曲线。
由于这一事实,在密码学中,我们必须在曲线的质数阶子群中工作,因此,出于安全考虑,我们的群是素数。
Monero的子群比实际曲线的阶小8倍!因此,子群大小为l,即2^252 + 27742317777372353535851937790883648493
因此,只能为Monero提供有效的2^252 + 27742317777372353535851937790883648493公钥,或者使用edwards25519的其他任何东西。
正如JamesK.Polk所指出的,我们希望确保我们保持在循环子群中,而不是在关键材料中引入偏差。
有趣的是,我把l卡在sagemath中,乘以15,它确实适合256位。
确切地说,255.906890595609需要16次256.000000000000000000000000000000000000005位。数学哟。
https://stackoverflow.com/questions/68496608
复制相似问题