2011-01-05 20 views
7

Czy istnieje sposób na wygenerowanie klucza prywatnego z tablicy bajtów? Mam tablicę bajtów za pomocą metody getEncoded(), ale teraz muszę ją przekonwertować z powrotem do PrivateKey.Utwórz klucz prywatny z tablicy bajtów

Dzięki, Vuk

+0

Czy ta pomoc? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –

+0

Nie, to nie pomogło, ale dzięki, tak czy inaczej – Vuk

Odpowiedz

5

podana na Java docs

Keys otrzymuje się na ogół przez generatory kluczy, certyfikatów lub różnych klas tożsamości wykorzystywanych do zarządzania kluczami. Klucze można również uzyskać z kluczowych specyfikacji (przezroczyste reprezentacje podstawowego materiału klucza) za pomocą fabryki kluczy.

Klasa KeyFactory może ci w tym pomóc.

+0

Zapomniałem powiedzieć, że pracuję z javacard, który nie obsługuje Klasa KeyFactory. Obsługuje keyBuilder, ale nie wiem, jak używać tej klasy do moich potrzeb. – Vuk

3

Wyrzuć kodowaną tablicę bajtów. Na karcie JavaCard AFAIR nie ma możliwości dekodowania jej bezpośrednio - musisz ustawić różne kluczowe komponenty osobno.

Na przykład RSAPrivateKey musi zostać zainicjowany z wykładnik i moduł:

rsaPrivate = (RSAPrivateKey) javacard.security.KeyBuilder.buildKey 
    (javacard.security.KeyBuilder.TYPE_RSA_PRIVATE, 
    javacard.security.KeyBuilder.LENGTH_RSA_512, false); 

byte[] exponent = {(byte) 7}; 
byte[] modulus = {(byte) 33}; 
rsaPrivate.setExponent(exponent, (short) 0, (short) exponent.length); 
rsaPrivate.setModulus(modulus, (short) 0, (short) modulus.length); 

BTW: W razie pytań JavaCard Polecam JavaCard Forum na forach Oracle. Jeśli szukasz tam RSAPrivateKey znajdziesz interesujące posty.

+0

jaki jest sens getEncoded? Mogli równie dobrze rzucić wyjątek UnsupportedOperationException. – Jus12

+0

Funkcja getEncoded() jest dostępna tylko w J2SE. Zwraca klucz prywatny w postaci zakodowanej w PKCS # 8, który może być używany niemal wszędzie. Platforma JavaCard jest jednym z tych wyjątków. – Robert

+0

@ Robert Widzę. Dziękuję za wyjaśnienie. – Jus12

7

Szukałem również tej odpowiedzi iw końcu ją znalazłem. keyBytes to tablica bajtów oryginalnie utworzona za pomocą funkcji getEncoded().

//add BouncyCastle as a provider if you want 
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
//create a keyfactory - use whichever algorithm and provider 
KeyFactory kf = KeyFactory.getInstance("DSA", "BC"); 
//for private keys use PKCS8EncodedKeySpec; for public keys use X509EncodedKeySpec 
PKCS8EncodedKeySpec ks = new PKCS8EncodedKeySpec(keyBytes); 
PrivateKey pk = kf.generatePrivate(ks); 

Nigdy nie zrobił nic dla JavaCard ale z tego post, wygląda na to, można użyć KeyFactory klasę. Prawdopodobnie będziesz musiał pobrać bibliotekę BouncyCastle.

+1

dzięki. Świetna robota! Uratowałeś mi wiele godzin badań. To powinno być wybrane jako poprawna odpowiedź, chyba że platforma OP nie obsługuje dmuchanego zamku. – Jus12

+0

Nie rozumiem, co masz na myśli przez "jeśli chcesz". Czy to opcjonalne? – Jus12

+0

@ Jus12 Miałem na myśli, jeśli chcesz używać BouncyCastle i nie jest on jeszcze dostępny jako dostawca na platformie, z której korzystasz. Na przykład na Androidzie dodałem bibliotekę BouncyCastle i musiałem użyć tej linii, aby dodać BC jako dostawcę i użyć implementacji algorytmów BC. Cieszę się, że mogłem komuś pomóc! :) – marchica

0

Albo musisz sam rozszyfrować plamkę kodowaną PKCS # 8 (parsowanie BER) ASN.1 i ustawić komponenty, albo możesz pobrać komponenty z klucza prywatnego (przynajmniej prywatnego wykładnika i modułu) jako Java BigIntegers , przekonwertuj je na niepodpisane tablice bajtów i ustaw je w interfejsie API karty Java zgodnie z wyjaśnieniami Roberta. Przetwarzanie PKCS # 8 można wykonać na karcie Java Card, ale jest to dość przerażające ćwiczenie.

Powiązane problemy