【问题标题】:Replicating onion address algorithm?复制洋葱地址算法?
【发布时间】:2018-07-28 00:43:46
【问题描述】:

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

Generate a 1024-bit RSA keypair
Take the SHA-1 of the public key
Base32 encode the first 80 bytes of the hash

我尝试通过首先generating a memorable vanity URL 和 Scallion 来复制它,“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”函数给出不同的结果? Here is the code for crockford32_encodehere is the code for Base2n。我尝试了几乎所有格式/空白剥离和字符截断的组合,但从未接近所需的“zzzzzzycizaamf47”。

【问题讨论】:

  • 将问题发布到Tor 可能会得到更好的结果。

标签: php rsa tor phpseclib base32


【解决方案1】:

感谢@Yawning Angel,your answer helped,还有this question的答案,代码:

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

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 2013-08-28
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多