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
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
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.
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
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.
jaki jest sens getEncoded? Mogli równie dobrze rzucić wyjątek UnsupportedOperationException. – Jus12
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
@ Robert Widzę. Dziękuję za wyjaśnienie. – Jus12
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.
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
Nie rozumiem, co masz na myśli przez "jeśli chcesz". Czy to opcjonalne? – Jus12
@ 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
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.
Czy ta pomoc? http://forums.oracle.com/forums/thread.jspa?threadID=1525932&tstart=105 –
Nie, to nie pomogło, ale dzięki, tak czy inaczej – Vuk