使用OpenSSL.NET和现有密钥解密RSA

我在下面的代码中使用OpenSSL.Net生成OpenSSL RSA公钥和私钥。 但是,我似乎找不到使用给定私钥解密数据的方法。 我知道如果我调用生成密钥然后相应的方法加密和解密数据它工作正常。 但是,如果我尝试从给定公钥的外部源解密某些内容,我该如何使用该密钥进行解密。

注意:请不要给出不使用OpenSSL.NET的示例。 Microsoft加密提供程序比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; } 

我最终通过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; } 

我发现了这一点,并认为这是我祈祷的答案。 但是,使用openssl(1.0.0e Mac os x)生成pub / priv密钥,我无法再从加密文本中获取明文 – 是否存在我缺少的GetBytes / Baseencode类型步骤? 你有没遇到过这个?

编辑:我刚发布i然后遇到一个使用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); } } }