12个版本
0.4.1 | 2023年11月15日 |
---|---|
0.4.0 | 2023年11月15日 |
0.3.3 | 2022年12月15日 |
0.2.3 | 2022年11月23日 |
0.1.1 | 2022年11月18日 |
#935 in 密码学
每月21次下载
91KB
2K SLoC
NetText
基于文本的加密网络协议数据格式。
原理
- 仅使用ASCII字符的一个有限子集
- 具有一组基本的数据类型
- 保留复杂数据结构的原始表示,用于哈希和加密签名
- 最小值数据类型:一种只能用于表示标识符、数字和base64编码的字节字符串的字符串类型。
基本类型
一个术语可以是以下任何一种类型
- 一个字符串,可能只包含ASCII字母数字字符和有限的ASCII字符子集,这些字符可能不用于表示其他类型的术语
- 一个字典,将字符串(如上所述)映射到任何术语类型
- 一个列表,可以包含任何数量和类型的术语(可以是混合的)
- 一个序列,由上述至少两个组成(可以是混合的),仅由空格简单分隔;序列不能嵌套
字典表示如下
{
key1 = value1;
key2 = value2
}
列表表示如下
[ term1; term2 ]
序列表示如下
term1 term2 term3
因此,可以按照以下方式定义复杂的数据结构
SEND MESSAGE {
topic = blah;
to = [
TOPIC hello;
USER john
],
body = blah blah
}
解析后的字典或序列的原始表示被保留用于哈希目的。它在字节的序列中,在编码的字符串中,从两端裁剪了空格,代表编码的字典或序列。
在上面的复杂结构示例中,以下是序列和字典及其原始表示
- 顶级术语是一个序列,其原始表示是整个编码字符串(假设没有开头或结尾的空格)
- 序列的第三个术语是一个字典,其原始表示从
{
开始,到}
结束 - 字典的第二个映射是一个列表,其原始表示从
[
开始,到]
结束 - 字典的第三个映射是一个序列,其原始表示正好是
blah blah
。
由于字符串不能包含空格,因此它们总是与其原始表示等价。
结构映射
术语可以根据上下文以多种不同的方式解释
- RAW:术语被解释为其原始编码(见上述内容)
- STRING:如果术语是一个字符串或仅由字符串组成的序列,则术语被解释为其原始编码
- 版本:如果该术语是一个以字符串为第一个元素的序列,则将其解释为具有以下属性的版本
- 一个判别器(第一个元素)
- 一个值,如果只有两个项目,则为第二个项目,如果有超过两个项目,则为从第二个项目开始的序列
- 字典:如果术语是字典,则将其解释为字典
- 列表:如果术语是列表,则将其解释为列表
- 序列:如果术语是字符串、列表或字典,则将其解释为由该单个术语组成的序列。否则,术语是一个序列,将其解释为术语序列。
数据映射
术语还根据不同的数据类型进行映射
- INT:如果术语映射为字符串,则将其解码为十进制表示的整数
- BYTES:如果术语映射为字符串,则使用base64解码。由于字符串不能为空,字符串
-
用于表示空字节字符串。 - 加密数据类型(见下文)
加密数据类型
如密钥、哈希、签名等加密值以字符串编码,前缀表示所使用的算法,后跟":",然后是base64编码的值。
前缀如下
pk.box:
NaCl box API的公钥sk.box:
NaCl box API的私钥sk.sbox:
NaCl secretbox API的私钥h.sha256:
sha256 哈希h.sha512:
sha512 哈希h.sha3:
sha3 哈希h.b2:
blake2b 哈希h.b3:
blake3 哈希sig.ed25519:
ed25519 签名pk.ed25519:
ed25519 公共签名密钥sk.ed25519:
ed25519 私有签名密钥
还可以添加更多。
- HASH、PUBKEY、SECKEY、SIGNATURE、ENCKEY、DECKEY、SYMKEY:将BYTES解释为特定加密项的一组事物
依赖项
~5–6.5MB
~137K SLoC