2016-11-05 4 views
5

У меня есть открытый ключ Эллиптической кривой PEM, который я пытаюсь загрузить в Замок Bouncy, и все, что я пробовал до сих пор, терпит неудачу. Это пример ключа я пытаюсь нагрузка:Как загрузить открытые ключи эллиптической кривой PEM в замок Bouncy?

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

Он генерируется NodeJS Crypto модуля и имя кривой secp521r1. Позднее он закодирован в PEM npm package key-encoder. Я уже использовал его в 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 0x4d org.bouncycastle.math.ec.ECCurve.decodePoint (:-1) 

, когда я снял охрану и:

IllegalArgumentException Invalid point encoding 0x2d 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

Поскольку у вас есть до нашей эры, он может 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()

Смежные вопросы