2013-04-04 12 views
7

Mam funkcji, które z powodzeniem czyta openssl sformatowana klucz prywatny:RSA - BouncyCastle PEMReader powrocie PEMKeyPair zamiast AsymmetricCipherKeyPair odczytu klucza prywatnego

static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName) 
{ 
    AsymmetricCipherKeyPair keyPair; 

    using (var reader = File.OpenText(privateKeyFileName)) 
     keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject(); 

    return keyPair.Private; 
} 

i zwraca AsymmetricKeyParameter który jest następnie używany do odszyfrowania zaszyfrowanego tekstu.

Poniżej znajduje się kod odszyfrować:

public static byte[] Decrypt3(byte[] data, string pemFilename) 
{ 
    string result = ""; 
    try { 
     AsymmetricKeyParameter key = readPrivateKey(pemFilename); 

     RsaEngine e = new RsaEngine(); 

     e.Init(false, key); 
     //byte[] cipheredBytes = GetBytes(encryptedMsg); 

     //Debug.Log (encryptedMsg); 

     byte[] cipheredBytes = e.ProcessBlock(data, 0, data.Length); 
     //result = Encoding.UTF8.GetString(cipheredBytes); 
     //return result; 
     return cipheredBytes; 

    } catch (Exception e) { 
     Debug.Log ("Exception in Decrypt3: " + e.Message); 
     return GetBytes(e.Message); 
    } 
} 

Działają one w C# z wykorzystaniem biblioteki nadmuchiwany zamek i uzyskać właściwą odszyfrowane tekst. Jednakże, gdy dodałem to do Javy, PEMParser.readObject() zwraca obiekt typu PEMKeyPair zamiast AsymmetricCipherKeyPair, a java zgłasza wyjątek próbując go rzucić. Sprawdziłem C# i faktycznie zwraca AsymmetricCipherKeyPair.

Nie wiem, dlaczego Java zachowuje się inaczej, ale mam nadzieję, że ktoś tutaj może pomóc, jak rzucić ten obiekt lub przeczytać plik privatekey i odszyfrować pomyślnie. Użyłem tych samych plików public i privatekey zarówno w kodzie C#, jak i Java, więc nie sądzę, że błąd pochodzi od nich.

Tutaj odsyłające w wersji Java jak czytam PrivateKey:

public static String readPrivateKey3(String pemFilename) throws FileNotFoundException, IOException 
{ 
    AsymmetricCipherKeyPair keyParam = null; 
    AsymmetricKeyParameter keyPair = null; 
    PEMKeyPair kp = null; 
    //PrivateKeyInfo pi = null; 

    try { 
     //var fileStream = System.IO.File.OpenText(pemFilename); 
     String absolutePath = ""; 
     absolutePath = Encryption.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
     absolutePath = absolutePath.substring(0, (absolutePath.lastIndexOf("/")+1)); 
     String filePath = ""; 
     filePath = absolutePath + pemFilename; 

     File f = new File(filePath); 
     //return filePath; 

     FileReader fileReader = new FileReader(f); 
     PEMParser r = new PEMParser(fileReader); 

     keyParam = (AsymmetricCipherKeyPair) r.readObject(); 

     return keyParam.toString(); 

    } 
    catch (Exception e) { 
     return "hello: " + e.getMessage() + e.getLocalizedMessage() + e.toString(); 
     //return e.toString(); 
     //return pi; 
    } 
} 

Odpowiedz

5

kod Java został zaktualizowany do nowego API, które jest jeszcze zostać przeniesiony w poprzek do C#. Możesz wypróbować równoważną (ale teraz przestarzałą) klasę Java PEMReader. Zwróci jednak JCE KeyPair (część przyczyn zmiany była spowodowana tym, że oryginalna wersja działała tylko z typami JCE, a nie z lekkimi klasami BC).

Jeśli korzystasz z PEMParser, a otrzymasz z powrotem PEMKeyPair, możesz użyć org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair, aby uzyskać od niego JCE KeyPair. Idealnie byłoby BCPEMKeyConverter, ale wydaje się, że nie został jeszcze napisany. W każdym razie, to powinno być łatwe dokonanie AsymmetricCipherKeyPair:

PEMKeyPair kp = ...; 
AsymmetricKeyParameter privKey = PrivateKeyFactory.createKey(kp.getPrivateKeyInfo()); 
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(kp.getPublicKeyInfo()); 
new AsymmetricCipherKeyPair(pubKey, privKey); 

tych klas fabryczne są w pakiecie org.bouncycastle.crypto.util.

+0

Spróbuję dzięki – c0d3Junk13

+0

Tak, to absolutnie zadziałało! Dziękuję bardzo. Prawie uratowałeś mi życie! :) – c0d3Junk13

Powiązane problemy