6
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);
        }

    }
}

我使用“设置下一条语句”重复执行以下语句,即没有执行任何其他代码行。 byte[] encryptedData = encrypt.Encrypt(data, false);

我查看了 encryptedData 中的字节,发现 encryptedData 中的字节每次都在变化。这肯定是错的吗?如果公钥没有改变并且要加密的数据没有改变,那么“encryptedData”字节也不应该改变吗?

4

1 回答 1

5

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

RSA 填充(OAEP 或 PKCS#1 v1.5 兼容填充)是 RSA 安全所必需的。填充的随机部分还确保了多次加密纯文本时返回的密文是不同的。这是一个重要的安全要求,攻击者不应该仅仅通过寻找重复来找到关于纯文本的信息。

于 2012-02-08T13:38:31.627 回答