如何使用c#解密使用RSA1024加密的MD5哈希

时间:2011-09-12 20:08:33

标签: c# md5 rsa encryption

我试图在工作中验证文件的完整性并且很难处理它。我不太熟悉加密和散列,所以请耐心等待。

我有一些文件在其末尾有一个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,您可以:

  • 使用私钥加密
  • 使用公钥
  • 解密

enter image description here

邮件摘要使用私钥进行加密,然后只能使用 public 密钥进行解密。这样,您就知道只有拥有私钥的人才能签署该消息。

2 个答案:

答案 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是单向哈希。但是你可以查看哈希算法。有一些方法可以打破这个哈希,只做一些研究;)