【发布时间】:2022-01-15 21:33:33
【问题描述】:
我正在尝试找出如何识别或以编程方式从 v3 洋葱域中提取值 public key、checksum 和 version .最好在php中。
此处概述了 v3 洋葱域的规范: https://github.com/torproject/torspec/blob/main/rend-spec-v3.txt
对第 4.3.6 节特别感兴趣
The onion address of a hidden service includes its identity public key, a
version field and a basic checksum. All this information is then base32
encoded as shown below:
onion_address = base32(PUBKEY | CHECKSUM | VERSION) + ".onion"
CHECKSUM = H(".onion checksum" | PUBKEY | VERSION)[:2]
where:
- PUBKEY is the 32 bytes ed25519 master pubkey of the hidden service.
- VERSION is a one byte version field (default value '\x03')
- ".onion checksum" is a constant string
- CHECKSUM is truncated to two bytes before inserting it in onion address
Here are a few example addresses:
pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion
sp3k262uwy4r2k3ycr5awluarykdpag6a7y33jxop4cs2lu5uz5sseqd.onion
xa4r2iadxm55fbnqgwwi5mymqdcofiu3w6rpbtqn7b2dyn7mgwj64jyd.onion
如果我们以第一个域为例:pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion
如果我们去掉 .onion 后缀,应该留下 base32 编码的字符串 pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd。
我假设公钥是 base32 解码字符串的前 32 个字节?我在这里做了base32解码https://dencode.com/en/string?v=pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd&oe=UTF-8
不确定到目前为止我是否走在正确的轨道上,但我该如何从中识别校验和和版本组件?
下面的 php 似乎与 base32 在线解码器不匹配
$onionUrl = "pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion";
//remove suffix
$domain = str_replace(".onion", "", $onionUrl);
//base32 decode
$decoded = Base32::decode($domain);
echo $decoded."<br>";
【问题讨论】:
-
您似乎走在了正确的轨道上。前 32 个字节是公钥,最后一个字节是版本,然后是校验和
-
我有点困惑,因为它说最后一个字节(版本)默认值是
'\x03',但我不知道如何从最后一个字节推导出它。 -
一旦 base32 解码,最后一个字节就是一个类似 utf8 符号的正方形 - 是否需要以某种方式转换以导出版本?