20 个不稳定版本 (3 个破坏性更新)
0.4.4 | 2020年3月15日 |
---|---|
0.4.3 | 2020年3月15日 |
0.3.7 | 2020年3月15日 |
0.2.0 | 2020年3月14日 |
0.1.5 | 2020年3月14日 |
第2969位 解析器实现
每月68次下载
38KB
759 行
bdflib
此库提供读取和写入二进制字典格式(bdf)文件的方法,这些文件可以用来表示彩虹表。
使用方法
读取
use bdf::io::BDFReader;
use std::fs::File;
use std::io::BufReader;
fn main() {
let f = File::open("dictionary.bdf").unwrap();
let mut bdf_reader = BDFReader::new(f);
bdf_reader.read_metadata().unwrap();
let lookup_table = bdf_reader.read_lookup_table().unwrap();
let lookup_table = lookup_table.clone();
while let Ok(next_chunk) = &mut bdf_reader.next_chunk() {
if let Ok(entries) = next_chunk.data_entries(&lookup_table) {
println!("{:?}", entries);
}
}
}
写入
use bdf::chunks::{DataEntry, HashEntry};
use bdf::io::BDFWriter;
use std::fs::File;
use std::io::BufWriter;
use std::convert::Into;
fn main() {
let f = File::create("dictionary.bdf").unwrap();
let entry_count = 1;
let mut bdf_writer = BDFWriter::new(f, entry_count, false);
bdf_writer.add_lookup_entry(HashEntry::new("fakehash".into(), 3)).unwrap();
let mut entry = DataEntry::new("foo".into());
entry.add_hash_value("fakehash".into(), vec![0, 2, 3]);
bdf_writer.add_data_entry(entry).unwrap();
bdf_writer.finish().unwrap();
println!("Finished writing!");
}
二进制字典文件格式(bdf)
<BDF> = <Header><Chunk(META)><Chunk(HTBL)>[<Chunk(DTBL)>]
所有 u8
格式都是无符号大端数。
头部
原始(十六进制) 42 44 46 01 52 41 49 4e 42 4f 57
位置 | 名称 | 值 | 含义 |
---|---|---|---|
0-2 | 格式 | BDF |
指示 bdf 格式 |
3-4 | 版本 | u32 | 格式的修订版本(0x01) |
4-10 | 要花哨的话 | RAINBOW |
因为“彩虹”这个词怎么样 |
数据块
位置 | 名称 | 值 | 含义 |
---|---|---|---|
0-3 | 长度(l) | u32 | 数据块长度 |
4-7 | 名称 | ASCII | 数据块名称 |
8-l | 数据 | 任何 | 数据块数据 |
l + 1 - l + 5 | crc | crc | 数据块 crc 求和值 |
元数据块
元数据块内部数据的格式。数据对于文件的解析是必需的,且该块应该是文件中的第一个块。
位置 | 名称 | 值 | 含义 |
---|---|---|---|
0-3 | 块计数 | u32 | 文件中 DTBL 块的数量 |
4-7 | 每个块的条目数 | u32 | 每个块中数据行的最大数量 |
8-15 | 条目总数 | u64 | 文件中数据行的总数量 |
16-19 | 压缩方法 | ASCII/0x00000000 | 压缩方法的名称或未使用时为空字节 |
数据行
DTBL
块内部的数据格式。一个块包含多个数据行。
位置 | 名称 | 值 | 含义 |
---|---|---|---|
0-3 | 长度(lt) | u32 | 数据行的总长度 |
4-7 | 长度(l) | u32 | 密码字符串长度 |
8-l | 密码 | UTF-8 | 密码字符串 |
1: l+1 - l+5 | 类型 | u32 | 哈希函数的 id |
l+6 - l+x | 哈希 | 任何 | 散列函数的值。长度必须通过散列函数的ID来查找。 |
转到1 |
哈希条目
HTBL
块内部的格式。与DataRow一样,HashEntry在块中多次包含。
位置 | 名称 | 值 | 含义 |
---|---|---|---|
0-3 | ID | u32 | 在数据表中使用的条目ID |
4-7 | 输出长度 | u32 | 散列函数输出的长度 |
8-11 | 长度 | u32 | 散列函数名称的长度 |
12-长度 | 名称 | ASCII | 散列函数的名称 |
依赖关系
~2MB
~40K SLoC