RSA解密不正确的参数

时间:2014-02-15 18:44:51

标签: c# encryption hash cryptography rsa

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

我们创建了一个自动生成新密钥对的预编译器。公钥放在某处的.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解密此字符串(因为加密将使用公钥对,这不是我们想要的),并使用先前创建的实例,如下所示:

    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。我觉得错误的是密钥和明文的大小不一样。但是,我现在得到一个“糟糕的数据”。异常而不是错误的参数之一。加密不会给出任何错误。

1 个答案:

答案 0 :(得分:0)

我已经使用我不知道的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;
}
相关问题