#base #database #word-list #data #codec #binary-data #256

bin+lib base256

轻松编码和解码256进制数据

6 个版本 (3 个重大更新)

0.4.2 2023年2月22日
0.4.1 2023年2月20日
0.3.0 2023年2月11日
0.2.0 2018年1月15日
0.1.0 2018年1月15日

#467解析器实现

每月下载量 26 次

ISC 许可

70KB
915

lastresort(1) – 轻松编码和解码256进制数据

Crates.io Crates.io Crates.io License GitHub stars

您可能期望256进制的编码比16进制或64进制的编码更节省空间,但使用这个特定的符号集,情况并非如此!作为这一点的自然后果,当您使用256进制而不是16进制或其他紧凑表示手动输入数据时,您必须输入更多而不是更少的字符。

那么,为什么选择256进制编码呢?

手动输入64进制很痛苦。16进制也是如此。这两个(64进制和16进制),尤其是16进制,都容易在阅读和输入或说话时丢失跟踪。

lastresort的目标是,通过键盘或语音输入将二进制数据手动输入到计算机中,与输入16进制或64进制的编码相比,减少错误。

示例用例包括

  • 在运行其OS的USB闪存驱动程序的计算机上手动输入SSH私钥,该计算机没有持久存储,并且没有可用的摄像头,无法使用二维码输入数据。
  • 通过语音通道将二进制文件的内容传递给另一个人。

以下是一个快速示例

想象一个包含三个字节的文件。该文件的十六进制转储可能看起来像这样

00000000: 0505 05                                  ...

换句话说,该文件包含三个字节 0x05 0x05 0x05

在base64中,它是这样

BQUF

这还不错,无论是键入还是大声读出来,都既快又简单。

但是,当数据量增加时,手动键入字节或大声读出16进制或base64中的字节变得越来越困难。

lastresort 基256使用默认编解码器PGP Word List,上面的示例字节表示为

adult amulet adult

到现在为止,你应该已经看到了以下内容

  • 为什么这个命令的名称是 lastresort,以及
  • 在字节数量较多的情况下,lastresort 如何能发挥极大的帮助 :)

编解码器

lastresort 支持以下编解码器

  • PGP Word List,默认编解码器
  • EFF Short Wordlist 2.0,旧版编解码器

PGP Word List

PGP Word List [...] 是一个用于通过语音通道以清晰明确的方式传达数据字节的单词列表。它们在目的上类似于飞行员使用的北约语音字母表,只不过使用了更长的单词列表,每个单词对应于256个不同的数值字节之一。

[...]

实际上,该列表由两个列表 [...] 组成。使用两个列表的原因是因为大声朗读长随机单词序列通常存在三种错误风险

  1. 两个连续单词的交换,
  2. 重复单词,或者
  3. 省略单词。

为了检测所有三种类型的错误,两个列表交替用于字节序列中的偶偏移字节和奇偏移字节。

https://en.wikipedia.org/wiki/PGP_word_list

EFF Short Wordlist 2.0

EFF Short Wordlist 2.0 是一个包含易于记忆和区分的单词列表,具有一些额外的功能,使得单词易于输入

  • 每个单词都有一个独特的三位前缀。这意味着未来的软件可以在用户输入前三个字符后自动完成密码短语中的单词
  • 所有单词之间的编辑距离至少为3。这意味着未来的软件可以纠正任何单个错误 [...] (以及在许多情况下超过一个错误)。

https://www.eff.org/deeplinks/2016/07/new-wordlists-random-passphrases

此单词列表还用于 pgen 密码短语生成器。有关 pgen 的更多信息,请参阅 https://github.com/ctsrc/pgen

lastresort 中,当使用旧版编解码器时,使用此列表中的256个单词。

使用不同编解码器的示例输入和输出

在此存储库的 sample_data/original 目录中,我们有一个名为 id_ed25519 的文件,其中包含以下 OpenSSH ed25519 私钥

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACCdE5ZT2FyAqO/5dfMJHZ2LsKdK95x1Jo/kJB8es4O2HQAAAJiy+V66svle
ugAAAAtzc2gtZWQyNTUxOQAAACCdE5ZT2FyAqO/5dfMJHZ2LsKdK95x1Jo/kJB8es4O2HQ
AAAEAAr0Ou+od9Jnc+qb0VTq4zt3gF60+0ITRlL3HybqGLG50TllPYXICo7/l18wkdnYuw
p0r3nHUmj+QkHx6zg7YdAAAAEGVyaWtuQGxpYmVyYXRpb24BAgMEBQ==
-----END OPENSSH PRIVATE KEY-----

为了简洁起见,当使用旧版编码器生成的基256编码输出已从本README中省略。

下一个小节显示了使用默认编码器生成的基256编码输出。

使用 PGP Word List 编码器生成的示例输出

如果我们使用上述私钥 id_ed25519 作为输入运行 lastresort,并且我们使用 PGP Word List 编码器

cargo run -- -e pgp -i sample_data/original/id_ed25519 | fold -w 78 -s

我们得到以下基256编码输出

button commando button commando button detergent crusade disable dogsled 
enchanting bison enrollment drumbeat dinosaur drifter escapade dwelling 
disbelief bison enterprise Dupont disruptive egghead detector eating dinosaur 
bison divisive crusade fascinate button commando button commando button 
armistice flagpole congregate crowfoot hemisphere flagpole hideaway drifter 
insincere fallout determine chatter impartial enlist exodus Geiger inception 
flytrap hazardous crusade detector cranky detector cranky detector crowfoot 
disable chopper inertia flagpole hesitate edict detector cranky detector 
cranky dinosaur flagpole hesitate classroom indigo enlist equation cranky 
detector cranky detector cranky detector cranky detector cranky detergent 
cranky detector cranky detector dreadful infancy cranky detector cranky 
detector highchair insincere flatfoot conformist framework inception enlist 
existence allow equation inverse enchanting eating everyday indulge 
enrollment drunken detector cranky detector crucial determine flytrap 
dinosaur chopper filament eating conformist cubic informant cranky hydraulic 
dropper component chopper graduate fragile embezzle dosage disbelief enlist 
conformist drainage impetus dragnet graduate dragnet crossover chopper 
inferno chatter distortion goggles component Geiger distortion crowfoot 
councilman fracture impetus choking enrollment checkup disbelief drunken 
detector cranky detector dosage handiwork inverse coherence egghead corporate 
Christmas impetus hotdog hemisphere fracture armistice hockey hamburger 
cranky detector cranky detector highchair insincere flatfoot conformist 
framework inception enlist existence drunken informant drifter Eskimo edict 
inferno dropper equation cranky detector cranky determine crucial graduate 
crusade consulting enlist Eskimo checkup direction inverse detector gremlin 
enrollment cement consulting flytrap guitarist dreadful distortion deckhand 
filament checkup document hamlet divisive flytrap divisive classroom 
consulting indulge confidence dosage holiness cement headwaters dosage 
detergent classic gravity hamlet consensus dropper conformist deckhand 
equation allow detector cranky detector crusade detector cranky impartial 
chairlift enrollment hockey coherence goggles graduate classroom distortion 
glucose gossamer briefcase hydraulic flagpole concurrent egghead Eskimo 
gremlin consensus involve inception chisel hamburger cubic corporate 
chairlift coherence chairlift disruptive eating equipment Glasgow document 
chisel disbelief inverse glossary gremlin disable drainage disable chopper 
concurrent eating hemisphere Glasgow enterprise endow exodus dogsled 
determine goggles corrosion cement hemisphere chatter councilman indoors 
headwaters flytrap hideaway endow indigo indoors armistice goldfish 
concurrent guidance congregate glucose disbelief edict hesitate gazelle 
coherence drunken headwaters deckhand inferno Christmas insincere framework 
corrosion endow graduate cranky detector cranky detector crusade disable 
egghead informant fallout existence highchair indigo drunken disable indulge 
hurricane endow hesitate egghead informant endow exodus Dupont hurricane 
flagpole conformist choking detergent cranky hamburger dreadful dinosaur 
crowfoot equation commence decadence allow commando button commando button 
commando crusade enchanting crumpled cannonball dropper enterprise crusade 
enchanting dwelling escapade deckhand cannonball drumbeat equipment dogsled 
examine cranky Eskimo crusade cannonball dragnet dinosaur endow commando 
button commando button commando allow

压缩

当需要压缩时,处理压缩的首选方法是首先使用例如 gzip、xz、bzip2、brotli 或 lzma 等压缩工具单独压缩数据,具体取决于您的需求以及您的设备上可用的压缩工具。

然后使用 lastresort 编码压缩数据。然后在另一台设备上使用 lastresort 解码,然后使用与您使用的压缩工具相对应的解压缩工具进行解压缩。

使用文件 sample_data/original/id_ed25519 作为要压缩、编码、在另一台设备上输入并在另一台设备上解码和解压缩的数据的实用示例

  • 使用 xz 从示例文件 sample_data/original/id_ed25519 压缩数据,然后对其进行编码。

    xz < sample_data/original/id_ed25519 | lastresort | fold -w 78 -s | awk '{$1=$1};1'
    
  • 在另一台设备上,将编码后的单词输入到文本文件中,然后对其进行解码和解压缩

    mkdir -p ~/tmp/
    vim ~/tmp/id_ed25519_compressed_words.txt
    lastresort -d < ~/tmp/id_ed25519_compressed_words.txt | unxz > ~/tmp/id_ed25519
    

用法

lastresort [-d | --decode] [-i <INPUT_FILE>] [-o <OUTPUT_FILE>]
lastresort -h | --help
lastresort -V | --version

不使用任何选项时,lastresort 从标准输入读取原始数据,并将编码数据以连续的空格分隔的人类单词块写入标准输出。

选项

-d--decode [<DECODER>] 解码数据(默认操作是编码数据)。默认:pgp。可能的值:pgpeff

-e--encoder <ENCODER> 要使用的编码器。可能的值:pgpeff。如果未指定编码器,则将使用 pgp 编码器。与选项 -d 冲突。

-i--input <INPUT_FILE>INPUT_FILE 读取输入。默认是 stdin;传递 - 也表示 stdin。

-o--output <OUTPUT_FILE> 将输出写入 OUTPUT_FILE。默认是 stdout;传递 - 也表示 stdout。

-h--help 打印用法摘要并退出。

-V--version 打印版本信息并退出。

另请参阅

安装

  1. 安装 Rust.
  2. 运行 cargo install base256

依赖项

~0–320KB