2011-08-29 80 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

我听不懂,我认为我们必须使用公钥解密和私钥加密? –