รหัสของคุณใช้ได้ถ้าคุณขอให้ BouncyCastle สร้างคู่คีย์:
var gen = ใหม่ Ed25519KeyPairGenerator();
gen.init (ใหม่ Ed25519KeyGenerationParameters (ใหม่ SecureRandom ()));
var keyPair = gen.generateKeyPair();
var sk = ไบต์ใหม่ [32];
((Ed25519PrivateKeyParameters) keyPair.getPrivate()).เข้ารหัส(sk, 0);
var pk = ((Ed25519PublicKeyParameters) keyPair.getPublic()).getEncoded();
เหตุผลที่มันไม่ทำงานสำหรับคู่คีย์ Tor ของคุณเป็นเพราะ BouncyCastle ไม่ได้คำนวณคีย์สาธารณะโดยการคูณสเกลาร์ของจุดฐานด้วยคีย์ลับ little-endian ของคุณ
มันตามมาแทน อาร์เอฟซี 8032 และทำ SHA-512 กับเนื้อหาคีย์เริ่มต้นของคุณ ล้างข้อมูลและตั้งค่าบางบิต จากนั้นใช้เป็นคีย์ลับเพื่อกำหนดคีย์สาธารณะ
กำลังทำสิ่งนี้:
MessageDigest md = MessageDigest.getInstance("SHA-512");
ไบต์ [] ไดเจสต์ = md.digest (initialKeyMaterial);
var sk = subarray(ย่อย, 0, 32);
sk[0] &= 248;
sk[31] &= 127;
sk[31] |= 64;
var pk = basePoint.scalarMultiply(sk);
ถ้าคีย์ลับที่คุณระบุได้ผ่านการแปลง SHA-512 นี้แล้ว แสดงว่ารหัสของคุณล้มเหลวเพราะตอนนี้ทำ SHA-512 สองครั้ง เนื่องจากคุณไม่สามารถย้อนกลับการดำเนินการ SHA-512 ได้ ดังนั้นหากคุณต้องใช้ BouncyCastle คุณจะต้องสร้างรหัสลับของคุณใน BouncyCastle แล้วใช้กับ tor แทนที่จะใช้วิธีอื่น
อย่างไรก็ตาม เนื่องจากคุณอาจต้องเริ่มต้นด้วยคู่คีย์ Tor คุณอาจลองแก้ไขโค้ด BouncyCastle เพื่อไม่ทำการแปลง SHA-512 ก่อนที่จะใช้เป็นคีย์การลงนาม