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