一位朋友给了我一个挑战:他使用PHP的crypt函数(CRYPT_STD_DES)(来自PHP4)加密了一个字符串。我知道用于加密的盐,并且由于crypt是单向算法,我必须使用暴力方法,而且我知道密码只包含小写字母。
现在,我有16核(2x Xeon)和大量RAM的机器。什么是实施此强制攻击的最有效方法(我假设我将不得不使用PHP,这不太好,但如果你们有任何想法......)
[编辑]
我忘了提一下,加密的表示法是13chars长度,字符串少于8个字母,就像一个简单的密码加密:)
答案 0 :(得分:2)
从PHP手册:
crypt()将使用标准Unix返回散列字符串 基于DES的算法或替代方案 可用的算法 系统。
某些操作系统支持更多功能 比一种类型的哈希。事实上, 有时基于标准DES 算法被基于MD5的算法取代 算法。哈希类型被触发 通过盐论证。在5.3之前, PHP将确定可用的 安装时的算法基于 系统的crypt()。如果没有盐 提供,PHP将自动生成 要么是标准的两个字符(DES) 盐,或十二个字符(MD5), 取决于MD5的可用性
换句话说, crypt()函数只是从C库调用操作系统的crypt()函数。这意味着两件事。
首先,加密类型是标准化的。您不需要使用PHP来运行暴力,您只需要知道所使用的算法。像Cane和Abel或者开膛手杰克这样的许多程序都可以通过强力,字典或彩虹表攻击来破解几种算法。
其次,加密类型基于加密的操作系统。这意味着你可能不得不尝试几种不同的加密方法,除非有明显的线索说明使用了哪种方法(加密字符串的模式可能会让你知道某些东西)。
我绝对不会建议尝试使用PHP来强制它,因为解释语言的运行速度比编译的语言快得多。
答案 1 :(得分:2)
这是代码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);
}
该代码应该在 nowadays pc上运行一两天(2.10 ^ 11组合),你可以在几台机器上运行,一台从“a”到“gzzzzzzz”,另一台从“haaaaaaa”到“nzzzzzzz”等...例如。
答案 2 :(得分:1)
最有效(尽管可能是最不稳定)的方式可能是找到已经实现它的人(例如使用John the Ripper)。