1

根据我能找到的所有来源,洋葱/隐藏服务“域”是由这个过程生成的:

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”。

4

1 回答 1

1

谢谢@Yawning Angel,你的回答有帮助,也是这个问题的答案,代码:

function privkey2pubkey($privKey) {
    $privKey = str_replace(array("\r", "\n", ' ', '=', '-----BEGINRSAPRIVATEKEY-----', 
    '-----ENDRSAPRIVATEKEY-----'), '', $privKey); 
    $rsa = new Crypt_RSA(); $rsa->loadKey($privKey);
    return $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
}

function pubkey2addr($pubKey) {
    $pubKey = str_replace(array("\r", "\n", ' ', '=', '-----BEGINRSAPUBLICKEY-----', 
    '-----ENDRSAPUBLICKEY-----'), '', $pubKey); 
    $pubKey = base64_decode($pubKey);
    $pubKey = sha1($pubKey, true);
    $pubKey = substr($pubKey, 0, 10);
    $base32 = new Base2n(5, 'abvdefghijklmnopqrstuvwxyz234567', FALSE, TRUE, TRUE);
    $pubKey = $base32->encode($pubKey).PHP_EOL;
    return $pubKey;
}

需要 phpseclib 和Base2n

于 2018-02-18T03:43:11.107 回答