首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Monero Schnorr信号算法中random32_unbiased函数的工作原理

Monero Schnorr信号算法中random32_unbiased函数的工作原理
EN

Stack Overflow用户
提问于 2021-07-23 08:54:33
回答 1查看 80关注 0票数 1

零到莫内罗书中,我正在读关于Schnorr签名的文章。第2.3.4节从random32_unbiased()src/crypto/crypto.cpp引用代码库函数。我的理解是,这个函数在1l-1 (都包括在内)之间生成一个随机整数,其中l是一个大整数。

这一职能是:

代码语言:javascript
复制
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]这条线有什么用途?

我的主要问题是上面的问题,但总的来说,我不太明白函数是如何工作的,所以解释一下也会很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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位。数学哟。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68496608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档