【发布时间】: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