C# 使用RSACryptServiceProvider加密数据在我看来是一个奇怪的特性

C# 使用RSACryptServiceProvider加密数据在我看来是一个奇怪的特性,c#,rsacryptoserviceprovider,C#,Rsacryptoserviceprovider,我使用“setnextstatement”重复执行以下语句,即不执行任何其他代码行。 byte[]encryptedData=encrypt.encrypt(数据,false) 我查看了encryptedData中的字节,发现encryptedData中的字节每次都会更改。这肯定是错误的吗?如果公钥未更改且要加密的数据未更改,“encryptedData”字节也不应更改?否,它正在按预期工作。加密的数据每次都会更改,因为它使用一种填充方案,每次调用encrypt时都使用随机八位字节对纯文本进行加

我使用“setnextstatement”重复执行以下语句,即不执行任何其他代码行。
byte[]encryptedData=encrypt.encrypt(数据,false)


我查看了encryptedData中的字节,发现encryptedData中的字节每次都会更改。这肯定是错误的吗?如果公钥未更改且要加密的数据未更改,“encryptedData”字节也不应更改?

否,它正在按预期工作。加密的数据每次都会更改,因为它使用一种填充方案,每次调用encrypt时都使用随机八位字节对纯文本进行加密。唯一重要的是
Decrypt(Encrypt(data))
是否返回原始字节数组
data


RSA padding()是RSA安全所必需的。填充的随机部分还确保在多次加密纯文本时返回的密文是不同的。这是一项重要的安全要求,攻击者不应该仅仅通过寻找重复信息就能够找到有关纯文本的信息。

非常感谢您的解释以及如此快速的回复。我没有收到一封电子邮件告诉我你已经回答了我的问题,因此我推迟了回来。我重新测试了我的代码,增加了(但不是完全)信心,相信明显的随机性不会引起问题,也不会。在解密时,我假设salt必须从加密的字节中提取。salt由加密提供者处理。你所要做的就是调用
加密
解密
。用加密术语来说,这并不是一个salt,Tomislav。大多数情况下,它被称为“随机填充”。SALT通常用于基于密码的密钥派生函数(也称为密码哈希)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace EncryptionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            UnicodeEncoding ByteConverter = new UnicodeEncoding();

            byte[] dataToEncrypt = ByteConverter.GetBytes("Test data");

            string enc = Encrypt(dataToEncrypt);         
        }

        static string Encrypt(byte[] data)
        {
            UnicodeEncoding ByteConverter = new UnicodeEncoding();
            RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider();

            byte[] encryptedData = encrypt.Encrypt(data, false); //Repeat this line

            return ByteConverter.GetString(encryptedData);
        }

    }
}