2014-04-06 14 views
5

Używam w mojej aplikacji kryptografii RSA. Aby przechowywać wygenerowany klucz publiczny, konwertuję go na String, a następnie zapisz go w bazie danych.Klucz z łańcucha znaków w języku Java RSA

Key publicKey=null; 
    Key privateKey=null; 

    KeyPair keyPair=RsaCrypto.getKeyPairRSA(1024); 
    publicKey=keyPair.getPublic(); 
    privateKey=keyPair.getPrivate(); 



    String publicK=Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT); 
    String privateK=Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT); 

zapisać Struny publicK i privateK. Mój problem polega na tym, że gdy chcę zaszyfrować/odszyfrować tekst za pomocą RSA i użyć zapisanego klucza w formacie String, nie wiem jak przekonwertować go na Key.

public static String encrypt(Key publicKey, String inputText){ 
    byte[]encodedBytes=null; 
    String encryptedText=""; 
    try { 
     Cipher cipher=Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
     encodedBytes=cipher.doFinal(inputText.getBytes()); 
    } catch (Exception e) {Log.e("Error", "RSA encryption error"); } 

    encryptedText=Base64.encodeToString(encodedBytes, Base64.DEFAULT); 
    return encryptedText; 
} 

Masz jakiś pomysł? Thanks a lot

+0

Proszę, proszę, proszę nie przechowywać niezaszyfrowanych kluczy prywatnych w bazie danych. Jeśli musisz przechowywać klucze prywatne, które nazywają się escrowing, powinieneś szyfrować je kluczem symetrycznym znanym tylko twojej aplikacji. – KyleM

+0

Dziękuję, tak, myślę o tym. Czy możesz mi doradzić, jaki jest najlepszy sposób przechowywania klucza w aplikacji? Dzięki – rgreso

+0

użyj chronionego hasłem pliku kluczy Java. Sprawdź keytool Java ... – KyleM

Odpowiedz

7

Aby przekonwertować Publick (string) do Klucza Publicznego zrobić jak poniżej:

byte[] keyBytes = Base64.decode(publicK.getBytes("utf-8")); 
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey key = keyFactory.generatePublic(spec); 

Aby przekonwertować privateK (string) do klucza prywatnego zrobić jak poniżej:

byte[] keyBytes = Base64.decode(privateK.getBytes("utf-8")); 
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); 
KeyFactory fact = KeyFactory.getInstance("RSA"); 
PrivateKey priv = fact.generatePrivate(keySpec); 
+0

dzięki za odpowiedź. Eclipse pokazuje mi błąd: Metoda decodeBase64 (byte []) jest niezdefiniowana dla typu Base64. Czy możesz mi w tym pomóc? wielkie dzięki – rgreso

+0

@rgreso spróbuj tego kodu. – Rahil2952

+0

Dzięki za odpowiedź, ale nadal pokazuje błąd, tym razem chce innego parametru: Metoda dekodowania (byte [], int) w typie Base64 nie ma zastosowania dla argumentów (bajt []). Masz jakiś pomysł? Wielkie dzięki za Twój czas – rgreso

1

nie udało się móc komentować poprzedni post. Chciałbym wiedzieć, co jest „czysty” w

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear); 
0

mogę tylko przypuszczać linię:

PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(clear); 

z „czysty” miało być „keyBytes”