使用sha256managed解密哈希

时间:2015-05-15 17:35:03

标签: c# encryption hash

嗯,一周前我开始使用c#,我有点困惑。

我从密码学开始,基本上是哈希和盐。

我的老师为本周末做了一些“功课”,我和我的所有伙伴都非常困惑。

我有这个简单的代码:

练习包括“解密”散列密码(使用SHA256managed进行哈希处理),我们知道它是一个4个字符的数字。

我尝试使用循环并逐个解密所有字符,但我卡住了,我不知道如何继续。

如果你能帮助我,我真的很感激。

谢谢!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;

namespace Examen
{
    class Program
    {
        static void Main(string[] args)
        {

            string hashed_password = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";



            Console.ReadLine();
        }


    }
}

4 个答案:

答案 0 :(得分:5)

哈希是一种单向函数。给定密码'1805',您将获得'2DOrd5wHHjYbtrSvQ + SyTH6HUDID5z + XV / cV8aYOSzs ='的散列。

你不能倒退:给定'2DOrd5wHHjYbtrSvQ + SyTH6HUDID5z + XV / cV8aYOSzs ='的散列,你无法计算'1805'的密码。

但是,您可以尝试每个可能的密码,并查看每个密码的哈希值。然后,您有一个所有可能的哈希列表,所有可能的密码从'0000'到'9999'。在这种情况下,哈希列表中的某个位置是您感兴趣的:'YOSGtSkJ41KX7K80FEmg + vme4ioLsp3qr28XU8nDQ9c ='。

您的程序应该在不到一秒的时间内发现密码。

请注意,您的程序必须使用与UTF-16LE编码中的密码相同的格式来散列数据,该密码是8个字节的数据。确保您使用与密码一样的哈希数据格式进行哈希处理,否则您将永远找不到匹配项。

答案 1 :(得分:2)

您需要做的是计算来自0000-9999的所有值的哈希值,直到找到匹配的哈希值。

以下是一个为您计算哈希的方法示例,给定一个字符串:Obtain SHA-256 string of a string

编辑:这是一个简单的例子。

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;

namespace TestConsoleProject
{

class Program
{
        static void Main(string[] args)
        {
            string hashed_password = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";
            int index;

            for(index = 0; index <= 9999; index++)
            {
                if (hashed_password.Equals(sha256_hash(index.ToString("0000"))))
                    break;                            
            }

            Console.WriteLine("Password is: " + index.ToString("0000"));

            Console.ReadLine();
        }

        public static String sha256_hash(String value)
        {
            using (SHA256 hash = SHA256Managed.Create())
            {
                return Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(value.ToCharArray())));
            }
        }
    }
}

答案 2 :(得分:1)

我可能错了,但我确信它无法解密哈希字符串。它是sha256或sha512用于在数据库中存储密码的原因。

答案 3 :(得分:1)

因为你说你已经知道它是一个4位数字,所以我的认可是蛮力。

你可以这样做:

e* hd