Ваш код в порядке, если вы попросите BouncyCastle сгенерировать пару ключей:
var gen = новый Ed25519KeyPairGenerator();
gen.init (новые параметры Ed25519KeyGenerationParameters (новый SecureRandom()));
var keyPair = gen.generateKeyPair();
var sk = новый байт[32];
((Ed25519PrivateKeyParameters) keyPair.getPrivate()).encode(sk, 0);
var pk = ((Ed25519PublicKeyParameters) keyPair.getPublic()).getEncoded();
Причина, по которой он не работает для вашей пары ключей Tor, заключается в том, что BouncyCastle не вычисляет открытый ключ путем скалярного умножения базовой точки на ваш секретный ключ с прямым порядком байтов.
Вместо этого следует RFC 8032 и выполняя SHA-512 для исходного материала ключа, очищая и устанавливая определенные биты, а затем используя его в качестве секретного ключа для определения открытого ключа.
Он делает это:
MessageDigest md = MessageDigest.getInstance("SHA-512");
байт [] дайджест = md.digest (initialKeyMaterial);
var sk = подмассив (дайджест, 0, 32);
ск[0] &= 248;
ск[31] &= 127;
ск[31] |= 64;
var pk = basePoint.scalarMultiply(sk);
Если секретный ключ, который вы указываете, уже прошел это преобразование SHA-512, то ваш код дает сбой, потому что теперь он выполняет SHA-512 дважды. Поскольку вы не можете отменить операцию SHA-512, то, если вы должны использовать BouncyCastle, вам нужно будет сгенерировать свой секретный ключ в BouncyCastle, а затем использовать его с tor, а не наоборот.
Однако, поскольку вам, вероятно, нужно начать с пары ключей Tor, вы можете рассмотреть возможность изменения кода BouncyCastle, чтобы он не выполнял преобразование SHA-512 до его использования в качестве ключа подписи.