我知道ECDH中的密钥大小取决于椭圆曲线的大小。
如果它是 256位曲线(secp256k1),则密钥为:
Public: 32 bytes * 2 + 1 = 65 (uncompressed)
Private: 32 bytes
384位曲线(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位曲线的私钥值是可变的?
答案 0 :(得分:1)
其他曲线的私钥也是可变的,但是在编码为字节时它们不太可能表现出这种差异。
公钥编码为两个静态大小的整数,并以未压缩的点指示符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个中的三个字节1等(等等)。
请注意,ECDSA签名大小可能也会波动。 X9.42签名方案使用两个DER编码的 signed 整数。如果将最高有效字节的最高有效位设置为1,则对它们进行签名的事实可能会引入一个将所有字节都设置为零的字节,否则该值将被解释为负数。它由两个数字r和s组成,并且DER编码的大小还取决于编码的整数的大小,这一事实使得完整编码的大小相当难以预测。
另一种不太常见的ECDSA签名(平面)编码使用与公钥相同的静态大小的整数,在这种情况下,它的大小仅为N阶字节的两倍。
ECDH没有此问题。通常,共享秘密是ECDH计算结果的点的静态编码X坐标-或至少是使用密钥派生函数(KDF)从该点派生的值。