Расшифровка хэша md5: возможно ли. И если невозможно, то почему - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, знатоки c# и просто бывалые! Вот в последние время интересует один вопрос... Как посредством c# написать программу, чтобы она могла расшифровать 128 битный код (в народе просто md5)... Если кто-то не понял мой вопрос, то уточню... Мне нужно сделать такую же расшифровку кода, как на сайте (md5list.ru). P.S. Если это не возможно. Почему?
Как изменить этот код, что бы он не делал из текста md5, а из md5 делал текст?
using System;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;
 
using System.Text;
 
namespace MD5Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            string source = "Hello World!";
            using (MD5 md5Hash = MD5.Create())
            {
                string hash = GetMd5Hash(md5Hash, source);
 
                Console.WriteLine("The MD5 hash of " + source + " is: " + hash + ".");
 
                Console.WriteLine("Verifying the hash...");
 
                if (VerifyMd5Hash(md5Hash, source, hash))
                {
                    Console.WriteLine("The hashes are the same.");
                }
                else
                {
                    Console.WriteLine("The hashes are not same.");
                }
            }

        }
        static string GetMd5Hash(MD5 md5Hash, string input)
        {
 
            // Convert the input string to a byte array and compute the hash.
            byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
 
            // Create a new Stringbuilder to collect the bytes
            // and create a string.
            StringBuilder sBuilder = new StringBuilder();
 
            // Loop through each byte of the hashed data 
            // and format each one as a hexadecimal string.
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
 
            // Return the hexadecimal string.
            return sBuilder.ToString();
            
        }
 
        // Verify a hash against a string.
        static bool VerifyMd5Hash(MD5 md5Hash, string input, string hash)
        {
            // Hash the input.
            string hashOfInput = GetMd5Hash(md5Hash, input);
            Console.ReadKey();
            // Create a StringComparer an compare the hashes.
            StringComparer comparer = StringComparer.OrdinalIgnoreCase;
 
            if (0 == comparer.Compare(hashOfInput, hash))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
 
    }
}
 
// This code example produces the following output:
//
// The MD5 hash of Hello World! is: ed076287532e86365e841e92bfc50d8c.
// Verifying the hash...
// The hashes are the same.

Решение задачи: «Расшифровка хэша md5: возможно ли. И если невозможно, то почему»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Security.Cryptography;
 
namespace BruteForceTest
{
    class Program
    {
        private static char[] lowercase = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'w', 'x', 'y', 'z' };
        private static char[] uppercase = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'W', 'X', 'Y', 'Z' };
        private static char[] numbers = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        private static char[] special = { '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '{', '}', '[', ']', ';', ':', '<', '>', '?', '\'', '\"', '|', '\\', ',', '.', '/' }; 
        private static Random rand = new Random();
 
        private static List<char> addSetOfSigns(List<char> l, char[] set)
        {
            foreach (char c in set)
            {
                l.Add(c);
            }
 
            return l;
        }
 
        private static string replace(string _string, char _char, int _index)
        {
            if (_index == 0)
                return _char + _string.Substring(_index + 1);
            else if (_index == _string.Length - 1)
                return _string.Substring(0, _index) + _char;
            else
                return _string.Substring(0, _index) + _char + _string.Substring(_index + 1);
        }
 
        private static string replaceToHigher(List<char> _signs, string _pass, int _index)
        {
            int val = indexOf(_signs, _pass[_index]);
            if (val >= _signs.Count - 1)
                _pass = replace(_pass, _signs[0], _index);
            else
                _pass = replace(_pass, _signs[val + 1], _index);
            return _pass;
        }
 
        private static string replaceToHigh(List<char> _signs, string _pass, int _index)
        {
            return replace(_pass, _signs[_index + 1], _index);
        }
 
        private static int indexOf(List<char> _list, char _char)
        {
            for (int i = 0; i < _list.Count; i++)
            {
                if (_list[i] == _char) return i;
            }
 
            return -1;
        }
 
        private static string createMD5(string val)
        {
            MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
            byte[] data = Encoding.ASCII.GetBytes(val);
            data = x.ComputeHash(data);
            string ret = "";
 
            for (int i = 0; i < data.Length; i++)
                ret += data[i].ToString("x2").ToLower();
 
            return ret;
        }
 
        public static string bruteforce(string _md5pass)
        {
            List<char> bfSigns = new List<char>();
            addSetOfSigns(bfSigns, lowercase);
            addSetOfSigns(bfSigns, uppercase);
            addSetOfSigns(bfSigns, numbers);
            addSetOfSigns(bfSigns, special);
 
            int it = 0;
            int index = 0;
            String pass = bfSigns[index++].ToString();
            while (true)
            {
                Console.WriteLine(pass.ToString());
                if (!createMD5(pass.ToString()).Equals(_md5pass))
                {
                    if (it == -1)
                    {
                        for (int i = 0; i < pass.Length; i++)
                        {
                            pass = replace(pass, bfSigns[0], i);
                        }
                        pass += bfSigns[0];
                        it = pass.Length - 1;
                    }
                    else if (index < bfSigns.Count)
                    {
                        pass = replace(pass, bfSigns[index++], it);
                    }
                    else
                    {
                        index = 1;
                        if (it == 0 || it == -1)
                        {
                            for (int i = 0; i < pass.Length; i++)
                            {
                                pass = replace(pass, bfSigns[0], i);
                            }
                            pass += bfSigns[0];
                            it = pass.Length - 1;
                        }
                        else
                        {
                            while (indexOf(bfSigns, pass[it]) >= bfSigns.Count - 1)
                            {
                                pass = replace(pass, bfSigns[0], it--);
                                if (it == -1)
                                    break;
                            }
                            if (it != -1)
                            {
                                pass = replaceToHigher(bfSigns, pass, it);
                                it = pass.Length - 1;
                            }
                        }
                    }
                }
                else
                {
                    return pass;
                }
            }
 
            return null;
        }
 
        static void Main(string[] args)
        {
            bruteforce("66f1cf6176ee643d060c79c0323b59ed"); // TEST
            Console.ReadLine();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы