Cryptography EC公钥是否有标准的固定长度编码?

Cryptography EC公钥是否有标准的固定长度编码?,cryptography,digital-signature,dsa,elliptic-curve,diffie-hellman,Cryptography,Digital Signature,Dsa,Elliptic Curve,Diffie Hellman,我想知道,对于素域(192、224、256、384和521)上的每种曲线类型,ECDH(椭圆曲线Diffie Hellman)和ECDSA(椭圆曲线数字签名算法)的公钥大小是否有(我希望有)一个标准。如果使用其中一条“命名曲线”,则公钥大小是固定的,并且取决于基础曲线的“字段大小” 压缩与未压缩表示法 公钥大小还取决于使用的是“未压缩”表示还是“压缩”表示。在未压缩形式中,公钥大小等于字段大小的两倍(字节)+1,在压缩形式中是字段大小+1。因此,如果在上定义了曲线,则字段大小为256位或32字节

我想知道,对于素域(192、224、256、384和521)上的每种曲线类型,ECDH(椭圆曲线Diffie Hellman)和ECDSA(椭圆曲线数字签名算法)的公钥大小是否有(我希望有)一个标准。

如果使用其中一条“命名曲线”,则公钥大小是固定的,并且取决于基础曲线的“字段大小”

压缩与未压缩表示法 公钥大小还取决于使用的是“未压缩”表示还是“压缩”表示。在未压缩形式中,公钥大小等于字段大小的两倍(字节)+1,在压缩形式中是字段大小+1。因此,如果在上定义了曲线,则字段大小为256位或32字节。因此,公钥在未压缩形式中的长度正好为65字节(32*2+1),在压缩形式中的长度正好为33字节(32+1)

未压缩形式由0x04(类似于)加上公共点的x坐标的大端二进制表示加上y坐标的二进制表示的串联组成

GF(p)案 如果基础字段是GF(p),其中p是一个大素数(在p-256的情况下,是一个256位素数),那么x和y可以被认为是[0,p-1]中的元素。它们以通常的方式编码为 ((log2(p)+1)/8)字节整数,如果需要,MSB将填充为零

GF(2^m)案例 对于GF(2^m),x和y可以被认为是系数a_i等于0或1的多项式a_0+a_1x+a_2x^2+…+a_{m-1}x^{m-1}。它们的二进制表示就是系数的串联

进一步阅读
确切的细节可以在中找到。(特别是第10页和第11页的第2.3.3节椭圆曲线指向八位字节字符串转换。)

我一直在寻找答案,想在Java中分享我的答案。我的任务是从X509Certificate(正确的网站)获取密钥大小

方法#1-实际计算:

ECPublicKeyImpl ecPublicKey = (ECPublicKeyImpl) certificate.getPublicKey();
int publicKeyLength = (ecPublicKey.getEncodedPublicValue().length - 1) / 2 * 8;
(可能会添加第一个字节是否为0x04的验证)

方法#2-从某些“内部”提取:

好问题
ECParameterSpec spec = ecPublicKey.getParams();
AlgorithmParameters algorithmParameters = AlgorithmParameters.getInstance("EC");
algorithmParameters.init(spec);
Provider provider = algorithmParameters.getProvider();
provider.get("KeyPairGenerator.EC KeySize");