在 C# 中使用具有正确私钥和公钥对的 RSA 解密时出现错误数据异常

Posted

技术标签:

【中文标题】在 C# 中使用具有正确私钥和公钥对的 RSA 解密时出现错误数据异常【英文标题】:Bad data exception when decrypting using RSA with correct private and public key pair in C# 【发布时间】:2013-04-01 16:47:35 【问题描述】:

这是我的解密过程代码:

    private RSACryptoServiceProvider _rsa;
    private string _privateKey;
    private string _publicKey;

    public RsaLibrary()
    
        //initialsing the RSA object taking the option of a 1024 key size
        _rsa = new RSACryptoServiceProvider(1024);
        _privateKey = _rsa.ToXmlString(true);
        _publicKey = _rsa.ToXmlString(false);

    

 public string Decrypt(string ciphertext, string privateKey_ = null)
    
        if (String.IsNullOrEmpty(privateKey_))
        
            return DecryptToBytes(ciphertext, _privateKey);
        
        else
        
            return DecryptToBytes(ciphertext, privateKey_);
        
    

    private string DecryptToBytes(string ciphertext, string privateKey)
    
        if (String.IsNullOrEmpty(privateKey))
        
            throw new ArgumentNullException("Error: No key provided.");
        
        if (ciphertext.Length<=0)
        
            throw new ArgumentNullException("Error: No message to decrypt.");
        

        byte[] plaintext;
        byte[] ciphertext_Bytes = Encoding.Unicode.GetBytes(ciphertext);
        _rsa.FromXmlString(privateKey);

        plaintext = _rsa.Decrypt(ciphertext_Bytes, false);

        return Encoding.Unicode.GetString(plaintext);
    

加密代码:

        private string EncryptToByte(string plaintext, string publicKey)
    
        if (String.IsNullOrEmpty(publicKey))
        
            throw new ArgumentNullException("Error: No key provided.");
        
        if (plaintext.Length<=0)
        
            throw new ArgumentNullException("Error: No message to incrypt");
        


        byte[] ciphertext;
        byte[] plaintext_Bytes = Encoding.Unicode.GetBytes(plaintext);
        _rsa.FromXmlString(publicKey);

        ciphertext = _rsa.Encrypt(plaintext_Bytes, false);
        return Convert.ToBase64String(ciphertext);
    

我看不出哪里出错了。我已确保密钥正确。我在构造函数中使用这一行提取的公共的: _publicKey = _rsa.ToXmlString(false); 此公钥显示在我创建的表单上。私人我用“真”而不是假。

有什么想法吗?

【问题讨论】:

【参考方案1】:

密文不太可能是真正的 UTF-16 编码文本。假设 加密 端有类似:

string encryptedText = Encoding.Unicode.GetString(encryptedBytes);

您基本上已经丢失了数据。加密的结果是 not 文本 - 它是任意二进制数据。如果出于某种传输原因要将其转换为文本,则应使用 Base64,例如

string base64EncryptedText = Convert.ToBase64String(encryptedBytes);

然后使用Convert.FromBase64String恢复原始加密二进制数据,准备解密。

【讨论】:

我同意,我有类似的问题,我正在转换为 32 字节而不是 16 字节。 我已经添加了一个额外的关于如何加密的内容。会有一个问题是我正在从富文本框中获取要加密的文本,并且还要从富文本框中获取要解密的文本。我认为所有文本在 UNICODE 的 windows 中都是 UTF-16 格式。这就是我一直在使用 UNICODE 进行交流的原因 @TafMunyurwa:将加密代码编辑到您的问题中 - 不要将其作为评论发布。 现在已修复,非常感谢您的帮助

以上是关于在 C# 中使用具有正确私钥和公钥对的 RSA 解密时出现错误数据异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 microsoft azure vault 中配置 RSA HSM 私钥和公钥?

Nimbus JOSE JWT 加密与 RSA、私钥和公钥

RSA公私钥和签名、验签过程

MAC OS下OpenSSL生成私钥和公钥以及RSA加密

MAC OS下OpenSSL生成私钥和公钥以及RSA加密

RSA公钥,私钥和数字签名通用理解