Я пытаюсь сгенерировать луковый адрес, созданный из открытого ключа.
Если следующая строка добавлена в код в предыдущее сообщение, сразу после privateKeyEncoded
String publicKeyEncoded = encoder.encodeToString(publicKey.getEncoded());
Когда я помещаю privateKeyEncoded в /var/lib/tor/hidden_service/private_key, сохраняю publicKeyEncoded и запускаю службу tor, новый Луковый адрес создан. Я пытаюсь получить тот же луковый адрес, что и служба tor, и адрес, созданный из publicKeyEncoded. Используя этот код
import org.apache.commons.codec.binary.Base32;
import org.apache.commons.codec.binary.Base64;
//base64 string from the public key created
String publicKeyTest = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMnFkJTMZ2ZxnqLwCiB/EWHjsHbnC+sKEIrGbyOTYiTl3LygsekAX6LhgcllscLUFqSKlMRB3jRB0GAPrIc73E/hTnmWBtF8NT8DhZzl06LZ1BtNjfON1pHm87STMAayiSaXPmSOwIqOA89aJPcA9m4v4IhtjYSFXmCAsE4RqoAwIDAQAB";
//the onion address the tor service gives when the private key is used
String onionAddressTest = "qqkhrc4men3fiqyl";
byte[] publicKeyDecoded = Base64.decodeBase64(publicKeyTest);
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = messageDigest.digest(publicKeyDecoded);
int numberOfCharacters = 10;
byte[] reducedHash = new byte[numberOfCharacters];
for(int i = 0; i < numberOfCharacters; i++) {
reducedHash[i] = sha1hash[i];
}
Base32 base32encoder = new Base32();
String onionAddress = base32encoder.encodeAsString(reducedHash).toLowerCase();
System.out.println(onionAddress); // but this gives "7j3iz4of464hje2e"
Я попытался использовать spongycastle, чтобы воспроизвести мое преобразование, но получил тот же ответ. Это заставляет меня думать, что что-то не так с тем, как я генерирую открытый ключ, или что-то не так с моим первоначальным преобразованием из base64.
Учитывая открытый ключ (publicKeyTest), как вы можете получить луковый адрес (onionAddressTest) с помощью java?