2016-11-05 17 views
5

Bouncy Kalesi'ne yüklemeye çalıştığım bir PEM kodlu Eliptik Eğri genel anahtarım var ve şu ana kadar denediğim her şey başarısız oluyor. Bu NodeJS Crypto modülü tarafından oluşturulur ve eğri adı secp521r1 olanPEM kodlu Elliptic Curve ortak anahtarları Bouncy Castle'a nasıl yüklenir?

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

: Bu benim yük çalışıyorum anahtarının bir örnektir. Daha sonra npm package key-encoder tarafından PEM'e kodlanmıştır. Bir imzayı doğrulamak için onu zaten JavaScript'te (ClojureScript) kullandım ve şimdi Java ile sunucudaki imzayı doğrulamam gerekiyor (aslında Clojure).

Korumaları anahtardan kaldırarak, bir bayt [] öğesine ve bir X509EncodedKeySpec oluşturmaya çalıştım. Bu işe yaramadı. O ile çöktü:

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

Ben anahtarını yüklemek için kullanıyorum kod: Ben de denedim

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

:

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

Ne olur ne olmaz, bu benim Clojure kodudur PKCS8EncodedKeySpec ama hatayı aldım:

Ben de burada bu yöntemi denedi: https://gist.github.com/wuyongzheng/0e2ed6d8a075153efcd3#file-ecdh_bc-java-L47-L50 ama decodePoint çalıştırırken hata alıyorum: on korumaları ile

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

: Muhafızları ve kaldırıldı

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

.

Neyi yanlış yaptığımı veya nasıl düzelteceğimi biliyor musunuz?

Ayrıca, yardımcı durumunda, bu özel anahtardır:

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

ve her şey geçerli gibi görünüyor:

$ 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----- 

cevap

2

Sonunda yüklemek için yönetilen masaj biraz Yapma: Eğer MÖ sahip olduğundan

(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

, (Ben yalnızca düz Java yapmak) yerine 'elle' bunu yapmanın dePEMify edebilirsiniz:

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 kodlaması yalnızca özel anahtarlar içindir; javadoc for java.security.Key.getFormat()

İlgili konular