C# 使用带有现有密钥的OpenSSL.NET解密RSA
下面的代码使用OpenSSL.Net生成OpenSSL RSA公钥和私钥。然而,我似乎找不到用给定的私钥解密数据的方法。我知道如果我调用generatekeys,然后调用相应的方法对数据进行加密和解密,它就可以正常工作。但是,如果我试图从给定公钥的外部源解密某些内容,如何使用该密钥进行解密 注意:请不要给出不使用OpenSSL.NET的示例。Microsoft加密提供程序比OpenSSL慢得多,不能满足我的速度要求 谢谢C# 使用带有现有密钥的OpenSSL.NET解密RSA,c#,encryption,openssl,rsa,C#,Encryption,Openssl,Rsa,下面的代码使用OpenSSL.Net生成OpenSSL RSA公钥和私钥。然而,我似乎找不到用给定的私钥解密数据的方法。我知道如果我调用generatekeys,然后调用相应的方法对数据进行加密和解密,它就可以正常工作。但是,如果我试图从给定公钥的外部源解密某些内容,如何使用该密钥进行解密 注意:请不要给出不使用OpenSSL.NET的示例。Microsoft加密提供程序比OpenSSL慢得多,不能满足我的速度要求 谢谢 public class AsymmetricKeyResult {
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;
}
我最终通过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类型的步骤?你遇到这个了吗 编辑:我刚发布,就遇到了一个使用UTF8编码而不是ASCII编码的不同示例,这很有效强> 本
我有一个以--BEGIN RSA PUBLIC key--开头的密钥,如何将其转换为上述格式?“如何将其转换为上述格式?”-使用OpenSSL中的
*\u PUBKEY
函数。看到了吗?我不明白,我想我们必须用公钥解密,用私钥加密?以防万一其他人遇到这种情况并感到困惑,我将用一个场景来解释密钥是如何使用的。比方说,我有一个文件,我想与你秘密共享,我会使用你的公钥加密我的文件,然后再发送给你。现在,我可以以我喜欢的任何方式发送加密文件,就像我喜欢的那样不安全,但只有您可以使用您的私钥对其进行解密,而原始文件将保留在我的手中。
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);
}
}
}