【问题标题】:ECC private key is longer than public keyECC 私钥比公钥长
【发布时间】:2016-09-25 10:41:36
【问题描述】:

我使用 secp192r1 曲线生成了 ECC 公钥和私钥。我得到 75 的公共和 125 的私有编码密钥数组长度。为什么私钥比公钥长?为什么私钥不比公钥长两倍?为什么私钥不是 192 位 = 24 字节因为 secp192r1?

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

ECNamedCurveParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("secp192r1");

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(ecSpec, new SecureRandom());
KeyPair pair = g.generateKeyPair();

System.out.println(pair.getPublic().getEncoded().length);
System.out.println(pair.getPrivate().getEncoded().length);

【问题讨论】:

  • 编码形式包含的不仅仅是裸键。它们是具有附加信息的更复杂 ASN.1 结构的编码版本。此外,椭圆曲线上的点可以用完整的 (X,Y) 对编码,也可以用更短的“压缩”形式编码,只包含 X 坐标加上一个符号位。在您的情况下,这些点使用完整的 (X,Y) 对进行编码。私钥结构包括公钥作为其组件之一。
  • 如何获取可以在 C lib micro-ecc 中复用的 24 字节密钥?
  • 将私钥转换为ECPrivateKey并调用getS方法。
  • ECPrivateKey privateKey = (ECPrivateKey)pair.getPrivate(); privateKey.getS();返回大整数。有没有办法获取字节数组?
  • 如何获取可以在这个库中使用的密钥github.com/kmackay/micro-ecc/blob/master/uECC.h

标签: bouncycastle private-key public-key elliptic-curve java-security


【解决方案1】:

下面的代码片段输出 24 字节的私钥:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp192r1");

KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
g.initialize(spec, new SecureRandom());
KeyPair pair = g.generateKeyPair();
ECPrivateKey ecPrivateKey = (ECPrivateKey)pair.getPrivate();

System.out.println(ecPrivateKey.getS().toByteArray().length);

【讨论】:

    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多