2011-08-29 86 views
4

我使用OpenSSL.Net生成一個OpenSSL RSA公鑰和私鑰。但是,我似乎無法找到一種用給定的私鑰解密數據的方法。我知道如果我調用生成密鑰,然後相應的方法來加密和解密數據,它工作正常。但是,如果我試圖從給定公鑰的外部源解密某個內容,那麼如何使用該密鑰解密。用現有密鑰解密使用OpenSSL.NET的RSA

注意:請不要給出不使用OpenSSL.NET的示例。 Microsoft Cryptographic提供程序遠遠低於OpenSSL,並且不符合我的速度要求。

謝謝!

public class AsymmetricKeyResult 
{ 
    public string PublicKey { get; set; } 
    public string PrivateKey { get; set; } 

    public AsymmetricKeyResult(string publicKey, string privateKey) 
    { 
     this.PublicKey = publicKey; 
     this.PrivateKey = privateKey; 
    } 
} 

public static AsymmetricKeyResult GenerateAsymmetricKeys(int keyLength) 
{ 
    RSA rsa = new RSA(); 
    rsa.GenerateKeys(keyLength, 0x10021, null, null); 
    AsymmetricKeyResult kResult = new AsymmetricKeyResult(rsa.PublicKeyAsPEM, rsa.PrivateKeyAsPEM); 

    return kResult; 
} 

回答

6

我最終通過Managed Wrapper for OpenSSL.NET上的對象瀏覽器來搞清楚它。這個作品:

public static byte[] AsymmetricEncrypt(string publicKeyAsPem, byte[] payload) 
    { 
     CryptoKey d = CryptoKey.FromPublicKey(publicKeyAsPem, null); 
     RSA rsa = d.GetRSA(); 
     byte[] result = rsa.PublicEncrypt(payload, RSA.Padding.PKCS1); 
     rsa.Dispose(); 
     return result; 
    } 

    public static byte[] AsymmetricDecrypt(string privateKeyAsPem, byte[] payload) 
    { 
     CryptoKey d = CryptoKey.FromPrivateKey(privateKeyAsPem, null); 
     RSA rsa = d.GetRSA(); 
     byte[] result = rsa.PrivateDecrypt(payload, RSA.Padding.PKCS1); 
     rsa.Dispose(); 
     return result; 
    } 
2

我發現這一點,並認爲這是我的祈禱答案。然而,使用openssl(1.0.0e Mac OS x)生成pub/priv鍵時,我無法再從加密文本中取回明文 - 是否有我缺少的GetBytes/Baseencode類型步驟?你遇到過嗎?

編輯:我剛發佈我然後遇到了一個不同的例子使用UTF8編碼不是ASCII,它的工作原理!

namespace testopenssl2 
{ 
class Program 
{ 

    public static byte[] AsymmetricEncrypt(string publicKeyAsPem, byte[] payload) 
    { 
     CryptoKey d = CryptoKey.FromPublicKey(publicKeyAsPem, null); 
     RSA rsa = d.GetRSA(); 
     byte[] result = rsa.PublicEncrypt(payload, RSA.Padding.PKCS1); 
     rsa.Dispose(); 
     return result; 
    } 

    public static byte[] AsymmetricDecrypt(string privateKeyAsPem, byte[] payload) 
    { 
     //CryptoKey d = CryptoKey.FromPrivateKey(privateKeyAsPem, null); 
     CryptoKey d = CryptoKey.FromPrivateKey(privateKeyAsPem, "pass"); 
     RSA rsa = d.GetRSA(); 
     byte[] result = rsa.PrivateDecrypt(payload, RSA.Padding.PKCS1); 
     rsa.Dispose(); 
     return result; 
    } 

    static void Main(string[] args) 
    { 
     String t = @"-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbhcU+fhYmYLESZQAj1hKBXsNY 
si0kYHNkxpP7ftxZiTFowWUVXHzQgkcYiCNnp3pt1eG6Vt0WDzyFYXqUUqugvX41 
gkaIrKQw/sRiWEx49krcz7Vxr3dufL6Mg3eK7NyWDGsqwFrx/qVNqdhsHg12PGNx 
IMY4UBtxin2A8pd4OwIDAQAB 
-----END PUBLIC KEY-----"; 
     String p = @"-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: DES-EDE3-CBC,0A128C2617BD2EB1 

pTDtXB+mockO7fvVqn4fwGnSb1Zv3HaMAALtpiB7Rn64eAHL7psKQIIM3qoshDWF 
XgXDdTnMOGO7wtYkd9R7iJYxgt19EuEdtu2SLLXQuN4ll+JSR2R/34dF19iMXI30 
d3pe7obTIwKdyRGuu8GgEm6bGai4pkqptP0HRA6qdMI2+Qfl9+VqUuvIm7tfpIRd 
/ZLENe756IrGDvI7lGx39Md/H2sgAJsWkSYubhmtxVJ0IEvbPuKDC5V5oLyTOoy+ 
6sc6ly57C4XHaTLhAKnYEvZAddnXg/e/VtfmTpqKx3n7D6FAKo1RjAjeZqEvefZd 
XAhh19YhZq3mdZNYUt7ojUarf/q3zrtTMLUxHdR0Be/VaQC5AE0d6quKyUQgxiti 
XNRS8xk9IJJqJLFSHO3ET+oTfcs+kLPuUDHqq0hY/OgW/THcDgPY1cDwtOX9yuI3 
YDoFTb3SXzRTmk2ui33f96wNPwzIAp9+TJzITxJYbF233Pz4YWuabrFuoNWZnwtT 
E/o6wcGfvAXTQkAKzwfLbTDmg5SSiGokoEcgm7qpfmQxKdmV1LmbW88DuAgdWggm 
Qf3ydZ2IrrtD1o+XP7JraeVOql0OK77pJh/bcr3bLiAT8YtsQUZLnOjkbDc3F1zW 
BGr6eeqUHxY6cqKieokhl9cBBjWuxJQL2h997svBufWdNOjTA4+32lXzDzi7bUxC 
xzIqZ7nm3YC2zUjla/l3Smz5KitqU5Y3Q9URpXOW+qMiPxmTHYOEcRDy9yh2U4iA 
CoTD6q0ZNJLEo3EVcDB+26O663/mQLuR69xstUgqHpSzGvXbqrmezA== 
-----END RSA PRIVATE KEY-----"; 

     System.Text.Encoding enc = System.Text.Encoding.ASCII; 
     String s = "hello"; 
     byte[] payload = enc.GetBytes(s); 
     Console.WriteLine("s: {0}", s); 

     byte[] byte_encData = AsymmetricEncrypt(t,payload); 

     String res; 
     res = Convert.ToBase64String(byte_encData); 
     Console.WriteLine("encypted: {0}", res); 

     byte[] byte_decrypted = AsymmetricDecrypt(p, byte_encData); 
     String res_unenc; 
     res_unenc = Convert.ToBase64String(byte_decrypted); 

     // works! 
     Console.WriteLine("decrypted: {0}", res_unenc); 

    } 
    } 
} 
+0

我有帶--- BEGIN RSA公鑰---如何將其轉換爲上面的格式開始的關鍵? – abhithakur88

+0

*「如何將其轉換爲上述格式?」* - 在OpenSSL中使用'* _PUBKEY'函數。請參閱[我如何在兩種公鑰格式之間轉換,一個是「BEGIN RSA PUBLIC KEY」,另一個是「BEGIN PUBLIC KEY」](http://stackoverflow.com/q/18039401)和 – jww

+0

我聽不懂,我認爲我們必須使用公鑰解密和私鑰加密? –