2016-11-05 18 views
5

私はBouncy CastleにロードしようとしているPEMエンコードされた楕円曲線の公開鍵を持っており、これまでに試したことはすべて失敗しています。それはNodeJS Cryptoモジュールによって生成され、カーブ名がsecp521r1あるBouncy CastleにPEMでエンコードされた楕円曲線の公開鍵をロードする方法は?

-----BEGIN PUBLIC KEY----- 
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBhsFCcWY2GaiN1BjPEd1v+ESKO6/0 
D0sUR4y1amHnOr3FZx6TdqdoSBqxownQrnAKGCwagGxUb7BWwPFgHqKQJHgBq+J7 
F+6m5SKAEL1wS5pqya91N7oudF3yFW8oZRE4RQRdSLl3fV2aVXKwGDXciwhUhw8k 
x5OS4iZpMAY+LI4WVGU= 
-----END PUBLIC KEY----- 

:これは私が負荷にしようとしているキーの一例です。後でnpm package key-encoderによってPEMにエンコードされます。私はすでに署名を検証するためにJavaScript(ClojureScript実際)でこれを使用しましたが、今ではJava(Clojure)でサーバー上の署名を検証する必要があります。

キーからガードを削除して、バイト[]にカバリングしてX509EncodedKeySpecを作成しようとしました。それはうまくいかなかった。それはとクラッシュした:

InvalidKeySpecException encoded key spec not recognised org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic (:-1) 

コード私はキーをロードするために使用していますに:

KeyFactory. 
    getInstance("ECDSA", "BC"). 
    generatePublic(new X509EncodedKeySpec(publicKey.getBytes())) 

を念のために、これは私のClojureのコードです:

(-> (KeyFactory/getInstance "ECDSA") 
    (.generatePublic (X509EncodedKeySpec. (.getBytes public-key)))) 

私も試してみましたPKCS8EncodedKeySpecですが、エラーが発生しました:

InvalidKeySpecException key spec not recognised org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic (:-1) 

は、私もここで、この方法を試してみました:https://gist.github.com/wuyongzheng/0e2ed6d8a075153efcd3#file-ecdh_bc-java-L47-L50をしかしdecodePointを実行しているとき、私はエラーを取得する:上の警備員と

IllegalArgumentException Invalid point encoding 0x2d org.bouncycastle.math.ec.ECCurve.decodePoint (:-1) 

:私は警備員とを取り除い

IllegalArgumentException Invalid point encoding 0x4d org.bouncycastle.math.ec.ECCurve.decodePoint (:-1) 

私が間違ってやっていることやアイデアを修正する方法はありますか?

また、それが助け場合には、これは秘密鍵です:

-----BEGIN EC PRIVATE KEY----- 
MIHbAgEBBEEjNeo52qeffbIQvSxRcWAPlyJjeEOov2JNxxwWKCtlowi07HsYNNyE 
jFDdSn8tSYAGx0rROrgpGuuJoG0zarPKz6AHBgUrgQQAI6GBiQOBhgAEAYbBQnFm 
NhmojdQYzxHdb/hEijuv9A9LFEeMtWph5zq9xWcek3anaEgasaMJ0K5wChgsGoBs 
VG+wVsDxYB6ikCR4AaviexfupuUigBC9cEuaasmvdTe6LnRd8hVvKGUROEUEXUi5 
d31dmlVysBg13IsIVIcPJMeTkuImaTAGPiyOFlRl 
-----END EC PRIVATE KEY----- 

、すべてが有効であると思わ:

$ openssl ec -in private.pem -pubout 
read EC key 
writing EC key 
-----BEGIN PUBLIC KEY----- 
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBhsFCcWY2GaiN1BjPEd1v+ESKO6/0 
D0sUR4y1amHnOr3FZx6TdqdoSBqxownQrnAKGCwagGxUb7BWwPFgHqKQJHgBq+J7 
F+6m5SKAEL1wS5pqya91N7oudF3yFW8oZRE4RQRdSLl3fV2aVXKwGDXciwhUhw8k 
x5OS4iZpMAY+LI4WVGU= 
-----END PUBLIC KEY----- 

答えて

2

私は最終的にそれをロードするために、管理マッサージのビットを行います:

(require '[clojure.string :as s]) 
(import '[java.security KeyFactory] 
     '[java.security.spec X509EncodedKeySpec] 
     '[java.util Base64]) 

(def public-key "-----BEGIN PUBLIC KEY----- 
MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBhsFCcWY2GaiN1BjPEd1v+ESKO6/0 
D0sUR4y1amHnOr3FZx6TdqdoSBqxownQrnAKGCwagGxUb7BWwPFgHqKQJHgBq+J7 
F+6m5SKAEL1wS5pqya91N7oudF3yFW8oZRE4RQRdSLl3fV2aVXKwGDXciwhUhw8k 
x5OS4iZpMAY+LI4WVGU= 
-----END PUBLIC KEY-----") 

(as-> public-key key 
     (s/replace key "-----BEGIN PUBLIC KEY-----" "") 
     (s/replace key "-----END PUBLIC KEY-----" "") 
     (s/replace key #"\s" "") 
     (.decode (Base64/getDecoder) key) 
     (X509EncodedKeySpec. key) 
     (.generatePublic (KeyFactory/getInstance "ECDSA" "BC") key)) 
1

BCを持っているので、手作業で行うのではなくdePEMifyできます(私は単純なJavaのみです):

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
Reader rdr = new StringReader("-----BEGIN PUBLIC KEY-----\n" 
     +"MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBhsFCcWY2GaiN1BjPEd1v+ESKO6/0\n" 
     +"D0sUR4y1amHnOr3FZx6TdqdoSBqxownQrnAKGCwagGxUb7BWwPFgHqKQJHgBq+J7\n" 
     +"F+6m5SKAEL1wS5pqya91N7oudF3yFW8oZRE4RQRdSLl3fV2aVXKwGDXciwhUhw8k\n" 
     +"x5OS4iZpMAY+LI4WVGU=\n" +"-----END PUBLIC KEY-----\n"); // or from file etc. 

org.bouncycastle.util.io.pem.PemObject spki = new org.bouncycastle.util.io.pem.PemReader(rdr).readPemObject(); 
PublicKey key = KeyFactory.getInstance("EC","BC").generatePublic(new X509EncodedKeySpec(spki.getContent())); 

System.out.println (key.getAlgorithm() + " " + ((ECPublicKey)key).getW().toString()); 

Example output: 
EC [email protected] 

FYI、PKCS8エンコーディングはプライベートキーのみです。 javadoc for java.security.Key.getFormat()

関連する問題