根据我能找到的所有来源,洋葱/隐藏服务“域”是由这个过程生成的:
Generate a 1024-bit RSA keypair
Take the SHA-1 of the public key
Base32 encode the first 80 bytes of the hash
我试图复制它,首先用 Scallion生成一个令人难忘的虚荣 URL,“zzzzzzycizaamf47.onion”。然后,我编写了一个 PHP 脚本,从该私钥派生出公钥,去除格式,散列,截断为 10 个字符,并对它进行 base32 编码。首先,我发现了三个不同的“编码为 base32”函数,它们都给出了不同的结果。这是代码,结果在三个函数后注释:
$privKey = 'MIIEpAIBAAKC ~snip~ azScNv5A';
$rsa = new Crypt_RSA();
$rsa->loadKey($privKey);
$pubKey = $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
$pubKey = str_replace(array("\r", "\n", ' ', '=', '-----BEGINRSAPUBLICKEY-----',
'-----ENDRSAPUBLICKEY-----'), '', $pubKey); //
$pubKey = sha1($pubKey);
$pubKey = substr($pubKey, 0, 10);
echo base_convert($pubKey, 16, 32).PHP_EOL; //Result: 68s3ii2
echo crockford32_encode($pubKey).PHP_EOL; //Result: 60rkjcb365hp2d1j
$base32 = new Base2n(5, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', FALSE, TRUE, TRUE);
echo $base32->encode($pubKey).PHP_EOL; //Result: GAYTSMLDGFRWCNBS
这里出了什么问题?为什么三个“base32”函数给出不同的结果?这是 crockford32_encode 的代码,这是 Base2n的代码。我尝试了几乎所有格式/空白剥离和字符截断的组合,但从未接近所需的“zzzzzzycizaamf47”。