我想知道对于素数域(192,224,256,384和521)上的每种曲线类型,是否有(我希望有) ECDH (Elliptic curve Diffie-Hellman)和ECDSA (Elliptic Curve Digital Signature Algorithm)的公钥长度标准。
发布于 2011-07-14 08:05:39
如果您使用其中一条“命名曲线”,则公钥大小是固定的,并且取决于基础曲线的“字段大小”。
压缩表示与未压缩表示
公钥大小还取决于使用的是“未压缩”表示还是“压缩”表示。在未压缩形式中,公钥大小等于字段大小(以字节为单位)的两倍+ 1,在压缩形式中为字段大小+ 1。因此,如果您的曲线定义在secp256r1 (also called NIST P-256 or X9.62 prime256v1)上,则字段大小为256位或32字节。因此,公钥在未压缩形式下恰好是65字节(32*2 +1)长,而在压缩形式下正好是33字节(32 +1)长。
未压缩的形式由0x04 (类似于DER OCTET STRING tag)加上x坐标的big-endian二进制表示加上公共点的y坐标的二进制表示的串联组成。
GF(p)情形
如果底层字段是GF(p),其中p是一个大素数(在P-256的情况下,是256位素数),那么x和y可以被认为是0,p-1中的元素。它们以通常的方式编码为((log2(p)+1)/8)-byte整数,必要时用零填充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}。它们的二进制表示就是系数的连接。
进一步阅读
具体细节可以在SEC1v2中找到。(特别是第10页和第11页的第2.3.3节椭圆曲线-点到八位字节字符串的转换。)
发布于 2017-08-05 06:04:58
我一直在寻找答案,并想用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");https://stackoverflow.com/questions/6665353
复制相似问题