Security 为什么P-521公钥X,Y有时是65字节有时是66字节

Security 为什么P-521公钥X,Y有时是65字节有时是66字节,security,go,elliptic-curve,ecdh,Security,Go,Elliptic Curve,Ecdh,我使用golang生成p-521公钥。 源代码如下所示: curve:=elliptic.P521() priv, x, y, err := elliptic.GenerateKey(curve, rand.Reader) xBytes:=x.Bytes() yBytes:=y.bytes() //len(xBytes) some time is 65 bytes ,some time is 66 bytes 为什么p-521公钥X,Y不像具有固定公钥长度的p-256或p-384?secp

我使用golang生成p-521公钥。 源代码如下所示:

curve:=elliptic.P521()
priv, x, y, err := elliptic.GenerateKey(curve, rand.Reader)
xBytes:=x.Bytes()
yBytes:=y.bytes()
//len(xBytes)  some time is 65 bytes ,some time is 66 bytes 

为什么p-521公钥X,Y不像具有固定公钥长度的p-256或p-384?

secp521r1
使用521位素数字段。因此,X或Y坐标表示为521位数字。是的,521,不是512

521位是65个完整字节,剩余一位。在公钥的固定大小编码中,最高有效字节的7个最高有效位始终设置为0,第8位将为1或0(因此整个字节为0x00或0x01)

由于坐标空间并不是所有521位的数字,因此为任何特定点设置高位的几率略低于50%

Go的方法似乎是使用最小字节表示返回值。所以你应该看到类似的东西

  • 66字节:49%的时间
  • 65字节:50%的时间
  • 64字节(前9位均为0):0.2%
  • (63字节及以下是可能的,但百分比非常小)

出于同样的原因,1和1000之间的随机数有时是4位数,有时是3位数,有时是2位数,有时是1位数。对于需要固定长度表示的应用程序(如JWK),如果返回的密钥长度不是66字节,那么调整长度的“最佳方法”是什么?如果我只是用一个空序列填充缺少的单元格,它会像预期的那样工作吗?(“\x00”)@KawaLo只要它不在任何类型的长度前缀结构中,当然,您可以添加前缀零。(例如,您无法在证书的SubjectPublicKeyInfo中执行此操作,因为它具有长度值,您需要重新计算所有内容…然后重新签署证书。)