1 个不稳定版本
0.1.0 | 2024年7月2日 |
---|
#237 in 测试
每月145 次下载
65KB
1.5K SLoC
Entropic
Entropic - 简单地将 Rust 结构体转换为非结构化字节及其反向转换
Entropic 特性允许将原始字节转换为 Rust 数据结构,并将数据结构转换回原始字节。
映射到/从非结构化字节
entropic
提供了一些关于数据映射方式的保证
1. 每个数据结构值都将由一个或多个非结构化字节序列映射。
从数学的角度来说,这意味着从非结构化字节到数据结构的函数是 满射。多个不同的非结构化字节序列映射到同一个数据结构值的情况并不少见,因此不应该假设不同的字节输入会导致不同的输出。
由于这种满射映射,某些数据结构值被选中的概率可能略高于其他值。某些方案提供了不同值之间概率差的保证,而 PureRandomScheme
则旨在提供在输入给定的情况下,每个输出值具有相同发生概率的密码学安全保证;然而,这些保证的代价是平均需要消耗比其他方案更多的熵输入字节。
2. 数据结构将映射到总是映射回相同数据结构的非结构化字节。
在数学术语中,假设 U
是所有可能的非结构化字节序列的集合,而 S
是所有可能的数据结构值的集合。entropic
提供了两个函数(from_entropy_source
和 to_entropy_sink
),分别可以表示为 f: U -> S
和 g: S -> U
。对于 S
中的每个值 s
,entropic 的目标是保证 f(g(s)) == s
。然而,对于 U
中的所有 u
,g(f(u)) == u
并不是必然的——多个字节序列可能映射到同一个数据结构值,但该值只能映射回这些序列中的一个。
这个特性在用 entropic
进行数据结构模糊测试时特别有用。模糊测试已经证明,当提供语义上有效的起始种子来探索有趣的路径时,跨领域效果更加显著。因此,entropic
允许用户定义一个预期的数据结构,并将其转换为在模糊测试期间映射到该结构的数据字节序列。
相较于其他库的改进
- 可以以(半)双射方式转换回非结构化字节
- 只要提供足够的数据,就保证数据结构形成,无论字节如何。其他库(如
arbitrary
)要求原始输入中存在某种结构才能成功(如字符串的语法有效的 UTF-8) - 模块化熵转换方案——如果您希望数据以不同的方式映射,可以选择将数据映射到结构的熵方案,或者甚至实现自己的映射!
依赖项
~0–320KB