一位 friend 给了我一个挑战:他使用 PHP 的 crypt 函数 (CRYPT_STD_DES)(来自 PHP4)加密了一个字符串。我知道用于加密的盐,并且由于 crypt 是一种单向算法,我必须使用蛮力方法,而且我知道密码仅由小写字母组成。
现在,我的机器有 16 个内核(2 个 Xeon)和大量 RAM。实现这种强制攻击的最有效方法是什么(我假设我必须使用 PHP,这不太好,但如果你们有任何想法......)
[编辑]
忘记说了,加密后的表示长度为13个字符,string少于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 组合)在现在 PC 上运行,您可以在多台机器上运行它,一台从“a”到“gzzzzzzz”,另一台例如,从“haaaaaaa”到“nzzzzzzz”等等。
关于PHP 的地穴挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3817945/