RSACryptoServiceProvider 使用 public 密钥解密失败
RSACryptoServiceProvider Decrypt failing using public key
我想我应该能够在服务器通过私钥加密发送数据时使用public密钥解密。但这是抛出错误。
var message = "test";
byte[] encryped;
byte[] decryped;
{
string path = ".\1.pfx";
string password = "1";
X509Certificate2 certificate = new X509Certificate2(path, password);
RSACryptoServiceProvider provider =
certificate.PrivateKey as RSACryptoServiceProvider;
encryped = RSAEncrypt(provider, Encoding.Unicode.GetBytes(message));
}
{
string path = ".\1.cer";
X509Certificate2 certificate = new X509Certificate2(path);
RSACryptoServiceProvider provider =
certificate.PublicKey.Key as RSACryptoServiceProvider;
decryped = RSADecrypt(provider, encryped);
}
Assert.IsTrue(message == Encoding.Unicode.GetString(decryped));
方法本身很简单。
public static byte[] RSAEncrypt(RSACryptoServiceProvider rsa, byte[] plaintext)
{
byte[] encryptedData;
encryptedData = rsa.Encrypt(plaintext, true);
return encryptedData;
}
public static byte[] RSADecrypt(RSACryptoServiceProvider rsa, byte[] ciphertext)
{
byte[] decryptedData;
decryptedData = rsa.Decrypt(ciphertext, true);
return decryptedData;
}
这是抛出以下错误。
System.Security.Cryptography.CryptographicException: 'Error occurred
while decoding OAEP padding.'
.NET 不公开 "raw"(或 "unpadded")RSA 操作。
在使用 RSA 的签名操作中,签名者采用哈希算法和哈希值,围绕它构建填充的结构化消息,并使用私钥执行 RSA 操作。
在验证操作中,验证者使用public密钥进行RSA操作,检查填充结构是否完整,并(直接或间接)检查散列算法和散列值是否符合预期结果。
在加密操作中,消息被放入加密填充结构中,RSA 操作使用收件人的 public 密钥执行。
在解密操作中,消息使用收件人的私钥进行 RSA 操作,验证填充结构,然后返回封装的消息。
|-----------|--------------|-----------------|
| Operation | Pub/Priv Key | Add/Rem Padding |
|-----------|--------------|-----------------|
| Sign | Private | Add PKCS#1/PSS |
| Encrypt | Public | Add PKCS#1/OAEP |
| Decrypt | Private | Remove (Encrypt)|
| Verify | Public | Remove (Sign) |
|-----------|--------------|-----------------|
因为你有一个签名,你需要一个操作,它使用 public 密钥和 RSA 操作并删除填充(而不是添加它)。这意味着只有 VerifyData
或 VerifyHash
会做你想做的事。
我想我应该能够在服务器通过私钥加密发送数据时使用public密钥解密。但这是抛出错误。
var message = "test";
byte[] encryped;
byte[] decryped;
{
string path = ".\1.pfx";
string password = "1";
X509Certificate2 certificate = new X509Certificate2(path, password);
RSACryptoServiceProvider provider =
certificate.PrivateKey as RSACryptoServiceProvider;
encryped = RSAEncrypt(provider, Encoding.Unicode.GetBytes(message));
}
{
string path = ".\1.cer";
X509Certificate2 certificate = new X509Certificate2(path);
RSACryptoServiceProvider provider =
certificate.PublicKey.Key as RSACryptoServiceProvider;
decryped = RSADecrypt(provider, encryped);
}
Assert.IsTrue(message == Encoding.Unicode.GetString(decryped));
方法本身很简单。
public static byte[] RSAEncrypt(RSACryptoServiceProvider rsa, byte[] plaintext)
{
byte[] encryptedData;
encryptedData = rsa.Encrypt(plaintext, true);
return encryptedData;
}
public static byte[] RSADecrypt(RSACryptoServiceProvider rsa, byte[] ciphertext)
{
byte[] decryptedData;
decryptedData = rsa.Decrypt(ciphertext, true);
return decryptedData;
}
这是抛出以下错误。
System.Security.Cryptography.CryptographicException: 'Error occurred while decoding OAEP padding.'
.NET 不公开 "raw"(或 "unpadded")RSA 操作。
在使用 RSA 的签名操作中,签名者采用哈希算法和哈希值,围绕它构建填充的结构化消息,并使用私钥执行 RSA 操作。
在验证操作中,验证者使用public密钥进行RSA操作,检查填充结构是否完整,并(直接或间接)检查散列算法和散列值是否符合预期结果。
在加密操作中,消息被放入加密填充结构中,RSA 操作使用收件人的 public 密钥执行。
在解密操作中,消息使用收件人的私钥进行 RSA 操作,验证填充结构,然后返回封装的消息。
|-----------|--------------|-----------------|
| Operation | Pub/Priv Key | Add/Rem Padding |
|-----------|--------------|-----------------|
| Sign | Private | Add PKCS#1/PSS |
| Encrypt | Public | Add PKCS#1/OAEP |
| Decrypt | Private | Remove (Encrypt)|
| Verify | Public | Remove (Sign) |
|-----------|--------------|-----------------|
因为你有一个签名,你需要一个操作,它使用 public 密钥和 RSA 操作并删除填充(而不是添加它)。这意味着只有 VerifyData
或 VerifyHash
会做你想做的事。