【问题标题】:How to use c# to decrypt an MD5 hash that is encrypted using RSA1024如何使用 c# 解密使用 RSA1024 加密的 MD5 哈希
【发布时间】:2011-09-12 20:08:33
【问题描述】:

我试图在工作中验证文件的完整性并且遇到了困难。我不太精通加密和散列,所以请耐心等待。

我有一些文件的末尾有一个 MD5 哈希。我编写了代码来获取我认为是散列的字节,它们的长度一致为 128 字节。在文件中,就在散列之前,是关键字“RSA1024”,我认为这意味着散列是使用 RSA 1024 加密的。

我知道文件中的 RSA 密钥,并且已经读出了字节(总是 258 字节长)。我看过很多使用 FromXmlString() 来获取密钥的教程,但是这个 RSA 密钥不是使用 .net 框架生成的,也不是 XML 格式的。

我编写了以下方法来使用密钥解密哈希数据,并且在执行 ImportCspBlob() 时抛出此错误 - System.Security.Cryptography.CryptographicException: Bad Version of provider。

有什么想法吗?

    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,您可以:

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

消息摘要使用私钥加密,然后只能使用公钥密钥解密。这样你就知道只有拥有私钥的人才能签署消息。

【问题讨论】:

  • 您知道,您不能“取消哈希”或“解密”哈希码。散列是一种单向操作。也就是说,我相信您的问题实际上是关于解密的,而散列这个词只是被滥用了!仅供参考
  • 澄清一下 - 该文件已使用 MD5 进行哈希处理,然后使用 RSA1024 加密 MD5 结果并将结果附加到文件中?
  • 您无法解密/去散列 MD5。 MD5 algorithm单向的。
  • 你和this questioner是同一个人吗?
  • 对不起,凯维克。也许我不够清楚。我不想解密哈希,我知道这是做不到的。我想解密加密哈希的结果,也就是文件末尾存储的内容。

标签: c# md5 rsa encryption


【解决方案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);
}

【讨论】:

  • 希望不会。如果它是该文件中的私钥,那么一切都会丢失。
  • 我认为他有一个密钥(在一个单独的文件中,而不是他正在检查的文件中),然后他从文件中获取要检查的字节并尝试使用该密钥对其进行解密。我认为他的密钥是 DER 编码的。
  • 我无法确定,但根据他的描述,他似乎正在尝试验证签名。
  • 试过上面的代码,但是不行。我得到一个“意外的内容结束标记”错误,或者如果我删除了包含 EOT 字节的前两个字节,我得到了错误"DER 长度超过 4 个字节:27"
  • 刚刚也尝试了位于jensign.com/JavaScience/dotnet/pempublic/pempublic.cs 的代码。但关键也不在于这些格式。
【解决方案2】:

MD5 是单向哈希。但是您可以查看散列算法。有一些方法可以打破这个哈希,只是做一些研究;)

【讨论】:

  • +1。 MD5 是一种单向哈希,除非您使用暴力破解,或者您根据已知值列表检查哈希,否则无法对其进行解密。
  • 重新阅读问题。他想要加密哈希的值(MD5 值被加密 - 他想要它回来)。
  • 对,我来晚了。真丢人。
猜你喜欢
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
相关资源
最近更新 更多