Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用sha256managed解密哈希_C#_Encryption_Hash - Fatal编程技术网

C# 使用sha256managed解密哈希

C# 使用sha256managed解密哈希,c#,encryption,hash,C#,Encryption,Hash,嗯,一周前我开始使用c#,我有点困惑 我从密码学开始,基本上是散列和盐 我的老师给了我们一些周末做的“家庭作业”,我和所有的同学都很困惑 我有一个简单的代码: 这个练习包括“解密”散列密码(使用SHA256managed散列),我们知道它是一个4个字符的数字 我试着用循环来解密所有字符,但是我被卡住了,我不知道如何继续 如果你能帮我一把,我会非常感激的 谢谢 using System; using System.Collections.Generic; using System.Linq; us

嗯,一周前我开始使用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();
        }


    }
}

我可能错了,但我确信解密散列字符串是不可能的。这就是为什么使用sha256或sha512在数据库中存储密码的原因

您需要做的是计算0000-9999之间所有值的散列,直到找到匹配的散列

下面是一个方法示例,该方法将在给定字符串的情况下为您计算哈希:

编辑:下面是一个简单的例子

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())));
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Security.Cryptography;
命名空间TestConsoleProject
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串哈希_password=“YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=”;
整数指数;

对于(index=0;index我的方法是使用蛮力,因为你说你已经知道这是一个4位数字了

您可以这样做:

  static void Main(string[] args)
    {
        string hashed = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";

        for (int i = 1000; i <=9999; i++)
        {
            string digit = i.ToString().PadLeft(4, '0');
            string s = ComputeSHA256(digit);
            if (s == hashed)
            {
                Console.WriteLine(digit + "is my decrypted hash");
                break;
            }
        }
        Console.ReadKey();
    }

    static string ComputeSHA256(string plainText)
    {
         SHA256Managed sha256Managed = new SHA256Managed();
        Encoding u16LE = Encoding.Unicode;
        string hash = String.Empty;
        byte[] hashed = sha256Managed.ComputeHash(u16LE.GetBytes(plainText), 0, u16LE.GetByteCount(plainText));
        return Convert.ToBase64String(hashed);
    }
static void Main(字符串[]args)
{
字符串hashed=“YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=”;

对于(int i=1000;i哈希是一个单向函数。给定密码“1805”,您将得到哈希值“2DOrd5wHHjYbtrSvQ+SyTH6HUDID5z+XV/cV8aYOSzs=”

您不能倒转:给定“2DOrd5wHHjYbtrSvQ+SyTH6HUDID5z+XV/cV8aYOSzs=”的散列,您无法计算“1805”的密码

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

您的程序应该用不到一秒钟的时间来发现密码


请注意,您的程序必须以UTF-16LE编码中与密码相同的格式散列数据,即8字节的数据。请确保您散列的数据格式与密码散列的数据格式相同,否则您将永远找不到匹配的数据。

我有点困惑,您是说散列的密码也包含一个salt?您也是说t吗密码是4个数字,如0000到9999?你知道salt是什么吗?它也是4个数字吗?原始密码可以是0000到9999之间的值,散列密码不包含salt。对不起,我的英语不好,我是非英语国家的人。我必须在0000到9999之间找到这个值(非散列密码)这个例子是给出的实际值吗?我通过一个非常好的破解程序()运行了它它没有找到结果。搜索词-实际上有一种方法,因为老师在课堂上给我们看了结果。不可能解密它们,但你可以做字典或暴力攻击,通过SHA256运行猜测并比较两个结果。如果它们匹配,你基本上解密了。是的,我是说暴力攻击。是的我同意,一个简单的循环,从0000到9999,对循环的当前位置进行散列,然后比较结果,就可以解决它。我怎么做?我几天前刚从c#开始,用蛮力攻击有点难对付,但我不知道该怎么做我知道如何散列密码,但我不知道怎么做我可以使用蛮力攻击获取原始字符串的值吗?您的代码永远不会等于或找到字符串。
hashed_密码
是base-64编码的,而不是十六进制。可能,但是
Select
string.Join
是不必要的。只需返回
Convert.ToBase64String(hash.ComputeHash)的值即可(…)
。此外,您可以使用
.ToString(“0000”)
,而不是使用“pad left”。这样可以减少创建额外字符串的需要。您的代码将永远不会等于或找到字符串。哈希密码是base-64编码的,而不是十六进制。此外,他不使用salt,因此必须删除。您还可能会丢失999个密码(0000至0999)。我错过了他关于不使用salt的评论。我是从1000开始这样做的,因为他明确地说这是一个4个字符的数字,但它也可以是前面加了0的前缀…..你对base64部分的看法也是正确的…..我在看了Jim下面的注释后也更正了编码部分…..现在给出了答案…..它是8765