首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用c#解密使用RSA1024加密的MD5哈希

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

Stack Overflow用户
提问于 2011-09-12 20:08:33
回答 2查看 20.5K关注 0票数 1

我试图验证一个文件的完整性在工作和有一个困难的时间。我对加密和散列不太熟悉,所以请容忍我。

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

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

我编写了以下方法来使用密钥对散列数据进行解密,并在执行ImportCspBlob() -ImportCspBlob坏版本的提供者时抛出此错误。

有什么想法吗?

代码语言:javascript
运行
复制
    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,你可以:

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

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

EN

回答 2

Stack Overflow用户

发布于 2011-09-12 21:05:10

您的密钥很可能不是CSP类型的密钥(它很可能是DER编码的)。您可以使用弹跳城堡对其进行解密,其密钥如下所示:

代码语言:javascript
运行
复制
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场景

如果要验证签名,则需要一个用于验证邮件、原始消息文本和现有消息签名的证书来与之进行比较。

您要做的是传递原始消息文本(减去签名)、消息签名的字节以及用于验证签名传递的证书的路径。

然后,您将散列原始消息,并将结果与在签名中传递的结果进行比较。

下面是一些代码来说明:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2011-09-12 20:14:26

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7393369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档