2

バイト配列からECC秘密鍵を作成しようとすると、以下の例外が発生します。私は公開/秘密鍵を持っており、Cライブラリmicro-ecc/uECC.hからの署名付き出力を出しています。 Cはsecp192r1曲線を使用した。私はJavaでCキーを生成してデータを検証しようとしています。バイト配列をプライベート/パブリックキーに変換するには?ECCPrivateKeyへのJavaバイト配列 - InvalidKeySpecException:エンコードされたキー仕様が認識されない

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. 
+0

どこでバイト配列を取得しましたか? – vojta

+0

私は公開/秘密鍵を持ち、Cのlibrarary micro-ecc/uECC.hで署名付きの出力を出しました。私はJavaでそれを検証しようとしています。 – Justas

+0

Cはsecp192r1を使用していましたが、公開鍵/秘密鍵をJavaでロードする際にそれを提供する必要があるかどうか、またそれを行う方法はわかりません。 – Justas

答えて

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)); 
関連する問題