【发布时间】:2014-03-15 03:34:40
【问题描述】:
对于我们的程序,我们做了一些预处理来验证一些数据文件的完整性。为此,我们计算使用私钥加密的哈希值,并在运行时使用公钥解密哈希值,并根据数据文件的哈希值进行检查。
我们创建了一个自动生成新密钥对的预编译器。公钥被放在某个地方的 .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。似乎我理解错了,密钥和明文不必是相同的大小。但是,我现在得到一个“错误数据”。异常而不是不正确的参数一。不过,加密不会产生任何错误。
【问题讨论】:
-
您使用的密钥长度(384 位)太小了,您不妨只存储未受保护的明文哈希。
-
是的,我也想通了。我似乎误解了一个来源,所以我认为密钥长度和明文大小必须相等。现在我让 CryptoServiceProvider 自己确定一个密钥长度,这样就解决了。无论如何,感谢您指出:)
标签: c# encryption hash cryptography rsa