【问题标题】:Java byte array to ECCPrivateKey - InvalidKeySpecException: encoded key spec not recognisedJava 字节数组到 ECCPrivateKey - InvalidKeySpecException:无法识别编码的密钥规范
【发布时间】:2016-09-23 00:10:51
【问题描述】:

当我尝试从字节数组制作 ECC 私钥时,我得到下面提到的异常。我有公钥/私钥和来自 C 库 micro-ecc/uECC.h 的签名输出。 C 使用 secp192r1 曲线。我正在尝试使用 Java 中 C 生成的密钥来验证数据。如何将字节数组转换为私钥/公钥?

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
byte[] kb = new byte[]{(byte)0x24, (byte)0xF4, (byte)0x36, (byte)0x16, (byte)0xD0, (byte)0x96, (byte)0x12, (byte)0x63, (byte)0x90, (byte)0x2E, (byte)0x51, (byte)0xF6, (byte)0x87, (byte)0x55, (byte)0xAB, (byte)0xCB, (byte)0x5D, (byte)0xAC, (byte)0x56, (byte)0x1A, (byte)0xA5, (byte)0xFA, (byte)0x55, (byte)0xDB};
X509EncodedKeySpec ks = new X509EncodedKeySpec(kb);
KeyFactory kf = java.security.KeyFactory.getInstance("ECDH", "BC");
org.bouncycastle.jce.interfaces.ECPrivateKey remotePublicKey = (org.bouncycastle.jce.interfaces.ECPrivateKey)kf.generatePublic(ks);

java.security.spec.InvalidKeySpecException: encoded key spec not recognised
at org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(Unknown Source)
at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)
at java.security.KeyFactory.generatePublic(KeyFactory.java:328)

我也试过用

KeyFactory.getInstance("ECDH", "BC"); 

但它会抛出与上面相同的异常。

KeyFactory.getInstance("EC");

抛出

java.security.InvalidKeyException: invalid key format

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=116, too big.   

【问题讨论】:

  • 你的字节数组是从哪里得到的?
  • 我有公钥/私钥和 C 库 micro-ecc/uECC.h 中的签名输出。我正在尝试用 Java 验证它。
  • C 使用了 secp192r1 但不知道在 Java 中加载公钥/私钥时是否需要提供以及如何提供。
  • 当我在 Java 中生成密钥对并创建副本时,它运行良好。
  • @Justas 如果您使用KeyPairGenerator.getInstance("EC")Java 中正确生成EC 密钥对,然后您可以使用KeyFactory 方法对其进行解析。那么可能你的byte[] 键是错误的或者有一些特定的格式。另请注意,您的代码中存在错误(与异常没有直接关系):kf.generatePublic(ks) 无法转换为ECPrivateKey,因此将其更改为:(org.bouncycastle.jce.interfaces.ECPublicKey)kf.generatePublic(ks);

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


【解决方案1】:

X509EncodedKeySpec(key)PKCS8EncodedKeySpec(key) 构造函数采用编码格式的私钥/公钥。未编码的密钥字节可以这样转换:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp192r1");

ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(new BigInteger(1, privateKeyBytes), spec); 

ECNamedCurveSpec params = new ECNamedCurveSpec("secp192r1", spec.getCurve(), spec.getG(), spec.getN());
java.security.spec.ECPoint w = new java.security.spec.ECPoint(new BigInteger(1, Arrays.copyOfRange(publicKeyBytes, 0, 24)), new BigInteger(1, Arrays.copyOfRange(publicKeyBytes, 24, 48)));
PublicKey publicKey = factory.generatePublic(new java.security.spec.ECPublicKeySpec(w, params));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2017-03-03
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多