2013-04-04 59 views
7

を読み取るためPEMKeyPairの代わりAsymmetricCipherKeyPairを返す私は正常にopensslのフォーマットされた秘密鍵の読み込み機能があります。RSA - はBouncyCastle PEMReader秘密鍵

static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName) 
{ 
    AsymmetricCipherKeyPair keyPair; 

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

    return keyPair.Private; 
} 

をして、暗号化されたテキストを復号化するために使用されAsymmetricKeyParameterを返します。

以下は復号化コードです:弾む城のライブラリを使用してC#で

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); 
    } 
} 

これらの仕事と私は正しい復号化されたテキストを取得します。しかし、これをJavaに追加すると、PEMParser.readObject()はAsymmetricCipherKeyPairの代わりにPEMKeyPair型のオブジェクトを返し、Javaはそれをキャストしようとすると例外をスローします。私はC#でチェックし、実際にAsymmetricCipherKeyPairを返しています。

Javaの動作が異なる理由はわかりませんが、ここで誰かがこのオブジェクトをキャストしたり、privatekeyファイルを読み込んで正常に復号化するのを助けてくれることを願っています。私はC#とJavaコードの両方で同じパブリックキーとプライベートキーファイルを使用したので、エラーはそれらのものではないと思います。参照のためにここに

私はのPrivateKeyを読んでいるかのJavaバージョン:

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; 
    } 
} 

答えて

5

Javaコードは、C#に渡って移植するまだ新しいAPIに更新されました。これと同等のJava PEMReaderクラスを試すこともできます。ただし、JCE KeyPairが返されます(元のバージョンはBC軽量クラスではなくJCEタイプのみで動作したため、変更の理由の一部になっていました)。

PEMParserを使用してPEMKeyPairを取得した場合は、org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPairを使用してJCE KeyPairを取得できます。理想的には、BCPEMKeyConverterが存在しますが、まだ書き込まれていないようです。

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

これらのファクトリクラスがorg.bouncycastle.crypto.utilパッケージにあります。いずれにせよ、AsymmetricCipherKeyPairを作るのは簡単でなければなりません。

+0

私は感謝を試みます – c0d3Junk13

+0

はい、それは絶対に働いた!どうもありがとうございます。あなたは私の人生をかなり救った! :) – c0d3Junk13

関連する問題