Mã của bạn vẫn ổn nếu bạn yêu cầu BouncyCastle tạo cặp khóa:
var gen = new Ed25519KeyPairGenerator();
gen.init(Ed25519KeyGenerationParameters mới(SecureRandom()) mới);
var keyPair = gen.generateKeyPair();
var sk = byte mới[32];
((Ed25519PrivateKeyParameters) keyPair.getPrivate()).encode(sk, 0);
var pk = ((Ed25519PublicKeyParameters) keyPair.getPublic()).getEncoded();
Lý do nó không hoạt động với cặp khóa Tor của bạn là vì BouncyCastle không tính toán khóa chung bằng phép nhân vô hướng của điểm cơ sở với khóa bí mật nhỏ-endian của bạn.
Thay vào đó, nó theo sau RFC 8032 và thực hiện SHA-512 trên tài liệu khóa ban đầu của bạn, xóa và đặt một số bit nhất định, sau đó sử dụng mã đó làm khóa bí mật để xác định khóa chung.
Nó đang làm điều này:
MessageDigest md = MessageDigest.getInstance("SHA-512");
byte [] digest = md.digest(initialKeyMaterial);
var sk = subarray(digest, 0, 32);
sk[0] &= 248;
sk[31] &= 127;
sk[31] |= 64;
var pk = basePoint.scalarMultiply(sk);
Nếu khóa bí mật bạn đang chỉ định đã trải qua quá trình chuyển đổi SHA-512 này, thì mã của bạn không thành công vì mã hiện đang thực hiện SHA-512 hai lần. Vì bạn không thể đảo ngược thao tác SHA-512 nên nếu phải sử dụng BouncyCastle, bạn sẽ cần tạo khóa bí mật của mình trong BouncyCastle rồi sử dụng khóa đó với tor, thay vì ngược lại.
Tuy nhiên, vì bạn có thể cần phải bắt đầu với cặp khóa Tor, nên bạn có thể cân nhắc sửa đổi mã BouncyCastle để không thực hiện chuyển đổi SHA-512 trước khi sử dụng nó làm khóa ký.