嗯,一周前我开始使用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();
}
}
}发布于 2015-05-16 02:08:34
散列是单向函数。给定密码'1805‘,您将得到'2DOrd5wHHjYbtrSvQ+SyTH6HUDID5z+XV/cV8aYOSzs='.的哈希
您不能倒退:给定散列'2DOrd5wHHjYbtrSvQ+SyTH6HUDID5z+XV/cV8aYOSzs=',,您不能计算密码'1805‘。
但是,您可以尝试所有可能的密码,并查看每个密码的哈希值。然后,您就有了从'0000‘到'9999’的所有可能的哈希的列表。在这种情况下,散列列表中的某个位置是您感兴趣的:'YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c='.
你的程序应该会在不到一秒的时间内发现密码。
注意,您的程序必须以与密码相同的格式散列数据,即UTF-16LE编码中的8字节数据。确保您散列的数据格式与密码的散列格式相同,否则您将永远找不到匹配项。
发布于 2015-05-16 01:48:06
您需要做的是计算从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())));
}
}
}
}发布于 2015-05-16 01:45:44
我可能是错的,但我非常确定不可能解密散列字符串。这就是为什么在数据库中使用sha256或sha512来存储密码的原因。
https://stackoverflow.com/questions/30265543
复制相似问题