有一个朋友给我的挑战:他加密使用PHP的crypt函数(CRYPT_STD_DES)的字符串(从PHP4)。我知道用于加密的盐,以及作为隐窝是单向算法我必须使用蛮力的方法,我知道密码仅由小写字母。

现在,我有16个核(2×至强),和大量的RAM机。什么是实现这个攻击力最有效的方式(我想我将不得不使用PHP,这是不太正常的,但如果您有任何的想法...)

<强> [编辑]

和我忘了提及,加密representaction是13chars长度,和字符串的长度超过8个字母少,就像一个简单的密码加密:)

有帮助吗?

解决方案

这是一个快速的尝试中的代码C(以gcc -O2 -lcrypt编译),点击 在Ubuntu 10.04.1

  #define _XOPEN_SOURCE
  #include <unistd.h>
  #include <stdio.h>
  #include <stdlib.h>

  void inc(char *p)
  {
     int i;
     for (i=0 ; i<8 && p[i]=='z' ; i++);
     if (i >= 8) exit(printf("Not found :-(\n"));
     if (!p[i]) p[i]='a';
     else p[i]++;
     while (--i >= 0) p[i]='a';
  }

  int main ()
  {
    char *salt = "XY";
    char *buzz = "XYaAbBcCZ0123";

    char pass[] = { 'a',0,0,0,0,0,0,0,0 };

    while(1)
      if ( ! strcmp(crypt(pass, salt), buzz))
        exit(printf("Found %s :-)\n", pass));
      else
        inc(pass);
  }

这代码应该在一两天(2.10 ^ 11的组合)中运行的现在的电脑,你可以在几台机器上运行它,一个从“一”到“gzzzzzzz”做,另一从 “haaaaaaa” 到 “nzzzzzzz” 等等...例如

其他提示

从PHP手册:

  

<强>隐窝()将返回使用该标准的Unix的散列串   基于DES的算法或可选的   算法可能会提供   系统

     

一些操作系统支持更多   超过一种类型的散列。事实上,   有时标准DES-基于   算法是由一个基于MD5替换   算法。哈希类型被触发   通过使盐参数。在此之前5.3,   PHP将确定可用   在安装时算法基于   该系统的的crypt()。如果没有盐   提供的,PHP将自动生成   一个标准的双字符(DES)   盐,或12字符(MD5),   根据MD5的可用性

换句话说,在隐窝()功能只是调用操作系统的隐窝()从C的库函数。这意味着两两件事。

首先,加密类型是标准化的。你并不需要使用PHP来运行蛮力,你只需要知道所使用的算法。像甘蔗和亚伯或开膛手杰克的许多应用程序都能够通过蛮力,字典,或彩虹表攻击打破几种算法。

其次,加密类型是基于操作系统在其上被加密。这意味着可能必须尝试几种不同的加密方法,除非有一个明显的线索,其用于(加密的字符串的图案可以线索你的东西)。

我绝对不会建议尝试使用PHP蛮力它,解释型语言比他们的同行编译运行慢得多。

最有效的(虽然可能是最challanging)的方法可能是找到谁已经实现了它(使用约翰开膛的例如)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top