【问题标题】:Loop through all possible ipv4 addresses in c#在 c# 中循环遍历所有可能的 ipv4 地址
【发布时间】:2021-03-18 05:11:10
【问题描述】:

目前这是我所拥有的:

            for (int a = number; a < 255; a++)
            {
                for (int b = 0; b < 255; b++)
                {
                    for (int c = 0; c < 255; c++)
                    {
                        for (int d = 0; d < 255; d++)
                        {
                            string ip = String.Concat(a, '.', b, '.', c, '.', d);
                            string _id = TruncateLongString(Hash(ip), 20);
                            if (_id == "AE18D602C836D7EAD1F8")
                            {
                                Console.WriteLine(ip);
                                Thread.Sleep(3600000);
                            }
                        }
                    }
                }
            }

但这很慢,而且需要绝对的时间。有没有其他方法可以做到这一点,最好是以更快的方式?此外,其原因是破解 sha1 哈希,我和另一个人试图弄清楚一个人如何在大约三秒内破解一个 ip 的哈希 (_id)。仅供参考,哈希也有一种盐,这是众所周知的。另外,如果您想知道,number 是我给线程使用的数字,从 1 上升到大约 40。此外,我们不知道该人使用什么编码语言,但我们猜测 c# 的速度,因为我们知道一些,但可能有更快的东西。

【问题讨论】:

  • 第一个想法是使用StringBuilder 连接a+b+c+d,或字符串插值。您可以使用Stopwatch 之类的东西检查什么更好...请记住,控制台写入也很慢...因此请尝试使用List&lt;string&gt;HashSet 将其排除在循环之外,这可能更好的是,例如您在最后加入,或者在您的情况下使用 NewLine 的简单字符串。你也可以试试IPAddress class。
  • Console.WriteLine 将是这里的引导项。而且这将产生大约 4.000.000.000 行。
  • 两者都是瓶颈(字符串分配和Console.WriteLine):参见,例如How come for loops in C# are so slow when concatenating strings?。 ——你真的不想这样做。也挺没用的。
  • 我认为在合理的时间内不可能计算出 40 亿个哈希值,所以要么哈希值已经准备好,要么人们猜到了 :)
  • 我认为1毫秒计算一百万个哈希是不可能的

标签: c# hash ip sha1


【解决方案1】:

您需要减少方法 Console.WriteLine 调用的数量。使用 Parallel.For 和生成 IP 地址的数组。请勿使用知名数据生成哈希,或添加前缀“some_{Ip}”

var array = new string[255];
for (int a = 1; a < 256; a++)
{
    for (int b = 0; b < 256; b++)
    {
        var prefB = String.Concat(a.ToString(), ".", b.ToString(), "."); 
        for (int c = 0; c < 256; c++)
        {
            var prefC =  String.Concat(prefB, c.ToString(), "."); 
            Parallel.For(0, 256, d =>
            {
                array[d] = String.Concat(prefC, d.ToString());
                
            });
            
            Console.WriteLine(string.Join(System.Environment.NewLine, array));
        }
    }
}

【讨论】:

  • 既然控制台输出是最关键的点,为什么不把写行放在主循环之外呢?使用 HashSet(或针对这种情况的任何更优化的集合)?
  • 集合的最大大小限制为~20亿个值,IP地址数~40亿,你需要做一个数组数组
  • 我写完答案后作者改了问题。
【解决方案2】:

另一个小提示:IPv4 地址的大小为 1 个字节 - 所以它们的范围是 0 到 255,而不是 254。

因此必须调整 for 循环:

for (int a = 0; a < 256; a++) {
    for (int b = 0; b < 256; b++) {
        for (int c = 0; c < 256; c++) {
            for (int d = 0; d < 256; d++) {

(很抱歉将通知作为答案,但我还不能发表评论)

【讨论】:

    【解决方案3】:

    首先,有 UInt32.MaxValue 可能的 IPv4 地址,但并非所有 IPv4 值实际上都是in use。所以你可以跳过永远不会被映射的范围。

    我猜应该可以在大约 3 个 CPU 小时内计算出所有 40 亿个可能的哈希值。如果您使用单个常量盐,攻击者可能会花时间预先计算完整的表以快速查找结果。 40 亿 * 10 字节的答案只有 40GB,很容易存储在 HD 上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-10
      • 2014-07-14
      • 2014-12-04
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多