RSACryptoServiceProvider使用公钥解密失败

时间:2018-02-09 09:05:18

标签: c# encryption rsa

我想我应该能够在服务器通过私钥加密发送数据时使用公钥解密。但这是一个错误。

    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:'发生错误   在解码OAEP填充时。'

1 个答案:

答案 0 :(得分:1)

.NET不公开" raw" (或" unpadded")RSA操作。

在使用RSA的签名操作中,签名者获取散列算法和散列值,在其周围构建填充的结构化消息,并使用私钥执行RSA操作。

在验证操作中,验证者使用公钥执行RSA操作,检查填充结构是否完整,并(直接或间接)检查哈希算法和哈希值是否与预期结果匹配。

在加密操作中,将消息放入加密填充结构中,并使用接收者的公钥执行RSA操作。

在解密操作中,消息使用收件人的私钥进行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)   |
|-----------|--------------|-----------------|

由于您有签名,因此需要使用带有RSA操作的公钥的操作并删除填充(而不是添加填充)。这意味着只有VerifyDataVerifyHash才会执行您想要的操作。