我试图在工作中验证文件的完整性并且很难处理它。我不太熟悉加密和散列,所以请耐心等待。
我有一些文件在其末尾有一个MD5哈希。我已经编写了代码来获取我认为是哈希的字节,并且它们看起来统一为128字节长。在文件中,就在哈希之前,是关键字“RSA1024”,我认为这意味着哈希是使用RSA 1024加密的。
我知道的是文件中的RSA密钥,并且已经读出了字节(总是258字节长)。我见过许多使用FromXmlString()来引入密钥的教程,但是这个RSA密钥不是使用.net框架生成的,并且不是XML格式。
我编写了以下方法来使用密钥解密哈希数据,并在执行ImportCspBlob()时抛出此错误 - System.Security.Cryptography.CryptographicException:提供程序的错误版本。
有什么想法吗?
public byte[] DecryptRSA(byte[] encryptedData, byte[] keyData)
{
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseExistingKey;
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(param);
rsaProvider.ImportCspBlob(keyData);
byte[] decryptedData = rsaProvider.Decrypt(encryptedData, false);
return decryptedData;
}
想要“解密MD5哈希”可能听起来很奇怪,特别是当一个人说他们想要“用公钥解密”时。但这就是数字签名的工作方式。使用RSA,您可以:
邮件摘要使用私钥进行加密,然后只能使用 public 密钥进行解密。这样,您就知道只有拥有私钥的人才能签署该消息。
答案 0 :(得分:1)
您的密钥很可能不是CSP类密钥(很可能是DER编码的)。您可以使用Bouncy Castle使用DER键对其进行解密,如下所示:
RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(key);
byte[] rv = null;
RsaEngine eng = new RsaEngine();
eng.Init(false, privateKey);
int size = eng.GetOutputBlockSize();
rv = eng.ProcessBlock(cipher, 0, cipher.Length);
编辑:解决GregS方案可能是签名验证操作
如果您要验证签名,则需要用于验证邮件的证书,原始邮件文本以及要比较的现有邮件签名。
您所做的是传递原始邮件文本(减去签名),邮件签名的字节以及用于验证传入签名的证书的路径。
然后,您将散列原始消息并将结果与传入的签名进行比较。
以下是一些代码来说明:
private bool VerifySignature(string messageText, byte[] messageSignature, string certificatePath)
{
// Load the certificate from a file
X509Certificate2 cert = new X509Certificate2(certificatePath);
// Get public key
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key;
// Next, hash the messageText
SHA1Managed sha1 = new SHA1Managed();
byte[] messageBytes = Encoding.Unicode.GetBytes(messageText);
byte[] hash = sha1.ComputeHash(messageBytes);
// Verify the signature with the hash
return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), messageSignature);
}
答案 1 :(得分:-1)
MD5是单向哈希。但是你可以查看哈希算法。有一些方法可以打破这个哈希,只做一些研究;)