C# RSA解密不正确的参数

C# RSA解密不正确的参数,c#,encryption,hash,cryptography,rsa,C#,Encryption,Hash,Cryptography,Rsa,对于我们的程序,我们做了一些预处理来验证一些数据文件的完整性。我们通过计算一个用私钥加密的散列来实现这一点,并在运行时使用公钥对散列进行解密,然后对照数据文件的散列进行检查 我们已经创建了一个预编译器,可以自动生成一个新的密钥对。公钥被放在一个.cs文件的某个地方,程序将使用它。私钥信息存储在一个临时文件中,稍后由计算散列并对其加密的程序使用 这是生成并存储密钥对的代码 // make keys var rsa = new RSACryptoServiceProvider(384); var k

对于我们的程序,我们做了一些预处理来验证一些数据文件的完整性。我们通过计算一个用私钥加密的散列来实现这一点,并在运行时使用公钥对散列进行解密,然后对照数据文件的散列进行检查

我们已经创建了一个预编译器,可以自动生成一个新的密钥对。公钥被放在一个.cs文件的某个地方,程序将使用它。私钥信息存储在一个临时文件中,稍后由计算散列并对其加密的程序使用

这是生成并存储密钥对的代码

// make keys
var rsa = new RSACryptoServiceProvider(384);
var key = rsa.ExportParameters(true);

// store public key in generated cs file
File.WriteAllText(Program.keyFileName, string.Format(Program.keyFileTemplate, Convert.ToBase64String(key.Exponent), Convert.ToBase64String(key.Modulus)));

// store private key in temporary file
File.WriteAllText("private-key.temp", rsa.ToXmlString(true));
在这之后,实际的程序被编译,我们运行一个后编译器。再次导入RSA参数,如下所示:

// read private key
string keyXml = File.ReadAllText("private-key.temp");
File.Delete("private-key.temp");

var rsa = new RSACryptoServiceProvider(384);
rsa.FromXmlString(keyXml);
    var toEncrypt = new byte[rsa.KeySize / 8];
    hashBytes.CopyTo(toEncrypt, 0);

    try
    {
        rsa.Decrypt(toEncrypt, false);
    }
    catch (CryptographicException e)
    {
        Console.WriteLine("whoops: " + e.Message);
    }
然后,我们处理数据文件并计算一个散列,然后将其保存到名为hashBytes的变量字节数组中。因为我想使用私钥对,所以我现在使用RSA对该字符串进行解密,因为加密将使用公钥对,而这不是我们在前面创建的实例中所希望的,如下所示:

// read private key
string keyXml = File.ReadAllText("private-key.temp");
File.Delete("private-key.temp");

var rsa = new RSACryptoServiceProvider(384);
rsa.FromXmlString(keyXml);
    var toEncrypt = new byte[rsa.KeySize / 8];
    hashBytes.CopyTo(toEncrypt, 0);

    try
    {
        rsa.Decrypt(toEncrypt, false);
    }
    catch (CryptographicException e)
    {
        Console.WriteLine("whoops: " + e.Message);
    }
但是,如果参数不正确,则会导致加密异常。环顾四周后,我甚至还没有找到这个错误的确切含义,但我认为RSA参数有问题,这是令人惊讶的,因为我假设使用XML字符串就可以了

我做错了什么

编辑:
我已经删除了固定密钥大小,现在直接加密hashBytes。看来我理解错了,密钥和明文不必是相同的大小。然而,我现在得到了一个坏数据。异常,而不是错误的参数1。不过加密不会出现任何错误。

我已经通过使用我不知道的RSACryptoProvider提供的签名方法解决了这个问题。最后一个代码块如下所示:

try
{
    var hashBytes = rsa.SignData(stream, new SHA256CryptoServiceProvider());

    File.WriteAllBytes(Program.modPath + "default.rf-modsignature", hashBytes);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    throw;
}

你使用的384位的密钥长度太小了,你最好只存储未受保护的明文散列。是的,我也知道了。我似乎误解了一个来源,所以我认为键长和明文大小必须相等。现在,我让CryptoServiceProvider自行确定密钥长度,这样就解决了这个问题。无论如何,谢谢你指出这一点: