首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ed25519测试向量

Ed25519测试向量
EN

Cryptography用户
提问于 2021-02-02 23:45:05
回答 1查看 597关注 0票数 2

我很抱歉,如果这是显而易见的,但事实是,我对此感到困惑。

我正在研究用于Ed25519的RFC 8032测试向量,我对该文件第7.1节中提供的信息有一些疑问。在本节的顶部,可以找到以下数据:

代码语言:javascript
复制
SECRET KEY:
   9d61b19deffd5a60ba844af492ec2cc4
   4449c5697b326919703bac031cae7f60

PUBLIC KEY:
   d75a980182b10ab7d54bfed3c964073a
   0ee172f3daa62325af021a68f707511a

我的理解是,密钥是一个随机生成的64个字节的字符串,其中的前32个字节将被进一步操作。根据RFC中描述的一些规则,结果字符串被解释为整数,然后通过将秘密密钥指定的次数添加到自己中的选定基点来获取公钥。

我的问题如下:

  1. 正如在RFC中显示的那样,密匙是否意味着要被解释为整数?如果是这样的话,整数是否已经以从左到右的形式显示--也就是说,9是它最重要的十六进制数字,0是最小的?
  2. 不管它是以整数还是字符串的形式显示,这是否应该是在RFC指定的位操作之后,而这些操作应该应用于通过散列随机生成的32个字节获得的64个字节?

要以不同的方式提出上述两个问题,公钥是否通过向自身添加基点0x9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60时间来获得?

  1. 至于公钥,我的猜测是,所显示的是在曲线中通过向上面提到的基点添加而得到的点,但受到文档中描述的压缩技术的影响。这是正确的吗?
EN

回答 1

Cryptography用户

发布于 2021-02-03 00:32:28

  1. 编码是小结尾(第5.1.2节.)所有的值都编码为八进制字符串,整数则使用小端点约定编码,即32-八进制字符串h0,...h31表示整数h0 + 2^8 * h1 +.+ 2^248 * h31。
  2. 密钥生成(5.1.5节)
    1. 使用SHA-512散列32字节私钥,将摘要存储在64位字节的大型缓冲区中,表示h。只有较低的32个字节用于生成公钥。

因此,您有需要使用SHA-512散列的32字节私钥。

代码语言:javascript
复制
1. Prune the buffer: The lowest three bits of the first octet are cleared, the highest bit of the last octet is cleared, and the second highest bit of the last octet is set.

这是用于SHA-512的较低的32字节输出。

代码语言:javascript
复制
1. Interpret the buffer as the little-endian integer, forming a secret scalar s.  Perform a fixed-base scalar multiplication [s]B.
  1. 公钥(5.1.5)
    1. 公钥A是点SB的编码。首先,将y-坐标(在0 <= y

  2. Python示例(第6节)
代码语言:javascript
复制
   # Points are represented as tuples (X, Y, Z, T) of extended
   # coordinates, with x = X/Z, y = Y/Z, x*y = T/Z

    def point_compress(P):
        zinv = modp_inv(P[2])
        x = P[0] * zinv % p
        y = P[1] * zinv % p
        return int.to_bytes(y | ((x & 1) << 255), 32, "little")
    
    def point_decompress(s):
        if len(s) != 32:
            raise Exception("Invalid input length for decompression")
        y = int.from_bytes(s, "little")
        sign = y >> 255
        y &= (1 << 255) - 1
    
        x = recover_x(y, sign)
        if x is None:
            return None
        else:
            return (x, y, 1, x*y % p)
    
    ## These are functions for manipulating the private key.
    
    def secret_expand(secret):
        if len(secret) != 32:
            raise Exception("Bad size of private key")
        h = sha512(secret)
        a = int.from_bytes(h[:32], "little")
        a &= (1 << 254) - 8
        a |= (1 << 254)
        return (a, h[32:])
    
    def secret_to_public(secret):
        (a, dummy) = secret_expand(secret)
        return point_compress(point_mul(a, G))
票数 1
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/87960

复制
相关文章

相似问题

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