繁体   English   中英

RSA解密不正确的参数

[英]RSA decrypt incorrect parameter

对于我们的程序,我们进行一些预处理以验证某些数据文件的完整性。 我们通过计算使用私钥加密的哈希值来实现,并在运行时使用公共密钥解密哈希值,并对照数据文件的哈希值进行检查。

我们创建了一个预编译器,可以自动生成一个新的密钥对。 公用密钥被放在一个.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);

然后,我们处理数据文件并计算哈希,然后将哈希保存到名为hashBytes (字节数组)的变量中。 因为我想使用私钥对,所以现在使用RSA与以前创建的实例一起使用RSA解密该字符串(因为加密将使用公钥对,这不是我们想要的),如下所示:

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

    try
    {
        rsa.Decrypt(toEncrypt, false);
    }
    catch (CryptographicException e)
    {
        Console.WriteLine("whoops: " + e.Message);
    }

但是,这导致CryptographicException“参数不正确。” 环顾四周后,我什至没有发现此错误的确切含义,但是我建议RSA参数有问题,这令人惊讶,因为我认为使用XML字符串就可以了。

我究竟做错了什么?

编辑:我删除了固定的密钥大小,现在直接加密hashBytes。 似乎键和明文的大小不必相同是错误的。 但是,我现在收到“错误数据”。 异常而不是错误的参数之一。 加密不会产生任何错误。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM