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解析器实现

Download history 2/week @ 2024-03-08 133/week @ 2024-03-29 24/week @ 2024-04-05

每月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