给定两个大素数,如何使用java获得一个地址

给定两个大素数,如何使用java获得一个地址,java,rsa,tor,Java,Rsa,Tor,给定两个大素数和一个公共指数,我想使用java计算tor服务的洋葱地址。给定以下代码: //a couple of large primes from https://primes.utm.edu/lists/small/small2.html BigInteger p = new BigInteger("140833594693385115726324477187474934050403623182058605002977360616302224310529980572507479005779

给定两个大素数和一个公共指数,我想使用java计算tor服务的洋葱地址。给定以下代码:

//a couple of large primes from https://primes.utm.edu/lists/small/small2.html
BigInteger p = new BigInteger("14083359469338511572632447718747493405040362318205860500297736061630222431052998057250747900577940212317413063");
BigInteger q = new BigInteger("76921421106760125285550929240903354966370431827792714920086011488103952094969175731459908117375995349245839343");
BigInteger publicExponent = new BigInteger("65537");

//get the private key
RSAPrivateCrtKeySpec crtKeySpec = new RSAPrivateCrtKeySpec(modulus, publicExponent, privateExponent, p, q, primeExponentP, primeExponentQ, crtCoefficient);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");      
PrivateKey privateKey = keyFactory.generatePrivate(crtKeySpec);
System.out.println(getPrivateKeyString(privateKey));

//get the public key -> onion address
RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(modulus, publicExponent);
PublicKey publicKey = keyFactory.generatePublic(publicSpec);
System.out.println(getOnionAddress(publicKey));
使用以下方法:

public static String getPrivateKeyString(PrivateKey privateKey) {
    Base64.Encoder encoder = Base64.getEncoder();  //using import java.util.Base64;
    String privateKeyEncoded = encoder.encodeToString(privateKey.getEncoded());
    StringBuffer sb = new StringBuffer();
    sb.append("-----BEGIN PRIVATE KEY-----\n");
    sb.append(privateKeyEncoded);
    sb.append("\n-----END PRIVATE KEY-----\n");
    String result = sb.toString();  
    return result;
}
我得到了xvufqn6goj4qh5uc的主机名。但是,当我在tor服务中使用生成的私钥时,生成的主机名是6qbn26dres64uon3.onion

我以前也问过类似的问题,但我认为我的公钥采用了不同的编码,并尝试了不同的按摩以获得预期的结果,但没有效果


如何在代码中生成正确的洋葱地址?

mate,如果您认为编码不同,为什么不将它们保存在一个文件中,然后从java代码中读取它们,这样可以确保您的代码和提交给tor编码的代码相同。这就是我对私钥所做的。我遇到的问题是公钥和从中获得正确的洋葱地址。在我看来是正确的,我猜你没有使用你认为是的RSA密钥。@JamesKPolk,所以我启动了另一台机器,重新运行了相同的代码(git pull),scp将私钥复制到运行tor服务的另一个vm,并获得另一个完全不同的地址!对p和q进行了素性检查,看起来还可以,但得到的公钥的位长度小于1024。为p和q选择两个新值,这将导致1024位长度,并获得预期的结果。我感谢您对我的代码的信任。我的猜测是,由于公钥的位长度太短,我遇到了问题。