Как использовать c # для расшифровки хэша MD5, зашифрованного с помощью RSA1024 - PullRequest
1 голос
/ 13 сентября 2011

Я пытаюсь проверить целостность файла на работе и в трудное время. Я не очень хорошо разбираюсь в шифровании и хешировании, так что терпите меня.

У меня есть несколько файлов, в конце которых находится хеш MD5. Я написал код для захвата байтов, которые, на мой взгляд, являются хешем, и они имеют одинаковую длину 128 байтов В файле, непосредственно перед хешем, находится ключевое слово «RSA1024», которое, как я понял, означает, что хеш зашифрован с использованием RSA 1024.

У меня есть ключ RSA в файле, и я считал байты (всегда длиной 258 байтов). Я видел много учебных пособий, в которых для извлечения ключа используется метод FromXmlString (), но этот ключ RSA не был создан с использованием инфраструктуры .net и не имеет формата XML.

Я написал следующий метод для расшифровки хеш-данных с помощью ключа, и он выдает эту ошибку при выполнении ImportCspBlob () - System.Security.Cryptography.CryptographicException: Bad Version провайдера.

Есть идеи?

    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

Дайджест сообщения зашифрован с помощью закрытого ключа и может быть затем расшифрован только с помощью открытого ключа. Таким образом, вы знаете, что подписать сообщение мог только человек с закрытым ключом.

Ответы [ 2 ]

1 голос
/ 13 сентября 2011

Ваш ключ, скорее всего, не является ключом типа CSP (он, скорее всего, закодирован с помощью DER). Вы можете расшифровать его, используя Надувной замок с ключом 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);
}
0 голосов
/ 13 сентября 2011

MD5 - односторонний хэш. Но вы можете проверить алгоритм хеширования. Есть несколько способов сломать этот хеш, просто сделайте небольшое исследование;)

...