2013-04-04 37 views
7

Tôi có một chức năng mà đọc thành công một định dạng openssl private key:RSA - BouncyCastle PEMReader trở PEMKeyPair thay vì AsymmetricCipherKeyPair cho việc đọc tin quan trọng

static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName) 
{ 
    AsymmetricCipherKeyPair keyPair; 

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

    return keyPair.Private; 
} 

và trả về một AsymmetricKeyParameter mà sau đó được sử dụng để giải mã một văn bản được mã hóa.

Dưới đây là đoạn code giải mã:

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

Những công việc trong C# sử dụng thư viện lâu đài bouncy và tôi nhận được văn bản giải mã chính xác. Tuy nhiên, khi tôi thêm điều này vào Java, PEMParser.readObject() trả về một đối tượng kiểu PEMKeyPair thay vì AsymmetricCipherKeyPair và java ném một ngoại lệ cố gắng truyền nó. Tôi đã kiểm tra trong C# và nó thực sự trở về AsymmetricCipherKeyPair.

Tôi không biết tại sao Java hoạt động khác nhau nhưng tôi hy vọng ai đó ở đây có thể giúp cách truyền đối tượng này hoặc đọc tệp tin cá nhân và giải mã thành công. Tôi đã sử dụng cùng một tệp công khai và khóa riêng tư trong cả mã C# và Java vì vậy tôi không nghĩ rằng lỗi đó là từ chúng.

đây để tham khảo các phiên bản Java như thế nào tôi đọc 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; 
    } 
} 

Trả lời

5

Mã Java đã được cập nhật một API mới, mà vẫn chưa được chuyển qua C#. Bạn có thể thử lớp Java PEMReader tương đương (nhưng bây giờ không được chấp nhận). Nó sẽ trả về một JCE KeyPair mặc dù (một phần lý do cho sự thay đổi là bởi vì phiên bản gốc chỉ làm việc với các loại JCE, chứ không phải các lớp hạng nhẹ BC).

Nếu sử dụng PEMParser và bạn lấy lại PEMKeyPair, bạn có thể sử dụng org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair để lấy JCE KeyPair từ nó. Lý tưởng nhất là sẽ có một BCPEMKeyConverter, nhưng nó dường như chưa được viết. Trong mọi trường hợp, nó phải là dễ dàng để thực hiện một AsymmetricCipherKeyPair:

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

Những lớp nhà máy đang trong gói org.bouncycastle.crypto.util.

+0

Tôi sẽ cố gắng cảm ơn – c0d3Junk13

+0

Vâng, điều đó hoàn toàn hiệu quả! Cảm ơn bạn rất nhiều. Bạn đã cứu mạng tôi rất nhiều! :) – c0d3Junk13

Các vấn đề liên quan