我知道ECDH中的键大小取决于椭圆曲线的大小。
如果是256位曲线(secp256k1),则键为:
Public: 32 bytes * 2 + 1 = 65 (uncompressed)
Private: 32 bytes384-bit曲线(secp384r1):
Public: 48 bytes * 2 + 1= 97 (uncompressed)
Private: 48 bytes但是对于521位曲线(Secp521r1),的情况非常奇怪:
Public: 66 bytes * 2 + 1 = 133 (uncompressed)
Private: 66 bytes or 65 bytes.我使用node.js密码模块生成这个密钥。
为什么521位曲线的私钥值是可变的?
发布于 2019-01-30 04:21:56
其他曲线的私钥也是可变的,但当编码到字节时,它们不太可能表现出这种差异。
公钥被编码为两个静态大小的整数,前缀为未压缩点指示符04。大小与键大小相同(以字节为单位)。
私钥实际上没有预先设定的编码。它是在范围1.N-1范围内的单个随机值(或向量),其中N是曲线的阶数。现在,如果您将此值编码为一个可变大小的无符号数字,那么通常它将与键的大小相同(以字节为单位)。然而,它可能是偶然的小一个字节,或两个,或三个或更多。当然,它要小得多的可能性是相当低的。
现在521位键有点奇怪,顺序的第一个、最重要的字节开始时没有将位设置为1;它只有最小的位设置为1。这意味着,私有值中最重要的字节(通常称为s)更短的可能性要大得多。
当然,确切的机会取决于订单的全部价值:
01FF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFA
51868783 BF2F966B 7FCC0148 F709A5D0
3BB5C9B8 899C47AE BB6FB71E 91386409但是,您可能会猜到,它非常接近于2中的1,因为后面有许多位设置为1。丢失两个字节的可能性当然是512个字节中的1个,131072中有3个字节(等等)。
请注意,ECDSA签名大小也可能会波动。X9.42签名方案使用两个DER编码的有符号整数。如果将最重要字节中的最重要位设置为1,则它们被签名的事实可能会将所有字节集设置为零,否则该值将被解释为负值。它由两个数字r和s组成,并且DER编码的大小也取决于编码整数的大小,这使得完全编码的大小很难预测。
ECDSA签名的另一种不太常见的(平面)编码使用与公钥相同的静态整数,在这种情况下,它仅是N阶字节大小的两倍。
ECDH没有这个问题。共享秘密通常是点的静态编码的X坐标,它是ECDH计算的结果,或者至少是使用密钥派生函数(KDF)从它导出的值。
https://stackoverflow.com/questions/54398706
复制相似问题