如今,创建密码字典通常需要将多个数据源拼接在一起。
理想情况下,最可能的密码应位于字典的开头,这样最常见的密码就能被瞬间破解。
借助现有的 去重工具,你不得不做出选择: 是 保留顺序 OR 处理海量字典。
不幸的是,字典创建这两者都需要
因此我用高度优化的 C 语言编写了 duplicut,以满足这个非常特定的需求 🤓 💻
git clone https://github.com/nil0x42/duplicut # 下载 ...
cd duplicut/ && make # 编译 ...
./duplicut wordlist.txt -o clean-wordlist.txt # 去重 !!!
-o, --outfile <FILE> 将结果写入 <FILE>
-t, --threads <NUM> 最大线程数(默认最大)
-m, --memlimit <VALUE> 限制最大使用内存(默认最大)
-l, --line-max-size <NUM> 最大行长度(默认 1024,最大 4095)
-p, --printable 仅保留 ASCII 可打印行
-c, --lowercase 将字典转换为小写
-C, --uppercase 将字典转换为大写
-D, --dupfile <FILE> 将重复项写入 <FILE>(会减慢 duplicut 速度)
-h, --help 显示此帮助并退出
-v, --version 输出版本信息并退出
特性:
--line-max-size 选项按最大长度过滤行--printable 选项过滤掉包含非可打印 ASCII 字符的行--dupfile 选项)--lowercase 或 --uppercase 选项忽略大小写实现:
限制:
--line-max-size 最大不能超过 4095一个 uint64 足以在哈希映射中对行进行索引,通过将 size 信息打包进指针的额外位:

如果整个文件无法放入内存,则将其分割成 个虚拟块,使得每个块尽可能使用更多 RAM。
然后将每个块加载到哈希映射中,进行去重,并针对后续块进行测试。
这样,执行时间最多减少到 th 三角形数:

如果你发现错误,或某些功能未按预期工作,请以调试模式编译 duplicut 并在 issue 中附带输出内容:
# 调试级别可以从 1 到 4
make debug level=1
./duplicut [OPTIONS] 2>&1 | tee /tmp/duplicut-debug.log