Score:2

การสร้างและตรวจสอบความถูกต้องของลายเซ็นด้วยรหัสส่วนตัวแบบขยาย ED25519

ธง jp

ฉันกำลังสร้างแอปส่งข้อความที่เข้ารหัสผ่านเครือข่ายทอร์ และตอนนี้ฉันมีปัญหากับการใช้คีย์ส่วนตัวที่ทอร์สร้างขึ้น ed25519 เพื่อลงชื่อและยืนยันข้อความใดๆ

โค้ดด้านล่างใช้งานได้กับคีย์ 32 ไบต์ แต่หลังจากข้าม 32 ไบต์ส่วนหัวของ hs_ed25519_secret_key ไม่สามารถตรวจสอบลายเซ็นในกรณีด้านล่าง:

1 - ความลับ: ครึ่งซ้ายของ 64 ไบต์ที่เหลือ สาธารณะ: ครึ่งขวา
2 - ความลับ: เหลือครึ่งหนึ่งของ 64 ไบต์ที่เหลือ สาธารณะ: 32 ไบต์สุดท้ายของ hs_ed25519_public_key หลังจากลบส่วนหัว
3 - ความลับ: ทั้งหมด 64 ไบต์ สาธารณะ: 32 ไบต์สุดท้ายของ hs_ed25519_public_key

ฉันพบห้องสมุดหลามที่ดูเหมือนจะทำเช่นนี้ PyNaCl อย่างไรก็ตามฉันไม่คุ้นเคยกับ py มากเกินไป

มีบางอย่างที่ฉันทำผิดหรือ bouncycastle ไม่รองรับคีย์ส่วนตัวแบบขยาย 64 ไบต์

นำเข้า org.bouncycastle.crypto.Signer;
นำเข้า org.bouncycastle.crypto.params.Ed25519PrivateKeyParameters;
นำเข้า org.bouncycastle.crypto.params.Ed25519PublicKeyParameters;
นำเข้า org.bouncycastle.crypto.signers.Ed25519Signer;
นำเข้า java.nio.charset.StandardCharsets;
คลาสสาธารณะ ED25519 {
    โมฆะสาธารณะคงที่ main (String[] args) โยนข้อยกเว้น {
        ไบต์ [] ข้อความ = "ข้อความที่จะลงนาม".getBytes (StandardCharsets.UTF_8);
        ผู้ลงนาม ผู้ลงนาม = ใหม่ Ed25519Signer();
        signer.init (จริง Ed25519PrivateKeyParameters ใหม่ (KeysUtil.myPrivKey, 0));
        signer.update (ข้อความ, 0, ข้อความความยาว);
        ผู้ตรวจสอบผู้ลงนาม = ใหม่ Ed25519Signer();
        verifier.init (เท็จ ใหม่ Ed25519PublicKeyParameters (KeysUtil.myPubKey, 0));
        verifier.update (ข้อความ, 0, ข้อความความยาว);
        บูลีน validSig = verifier.verifySignature(signer.generateSignature());
    }
}

```
Score:1
ธง es

รหัสของคุณใช้ได้ถ้าคุณขอให้ 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 ก่อนที่จะใช้เป็นคีย์การลงนาม

Miliano avatar
jp flag
อืม ขอบคุณสำหรับคำแนะนำ ฉันจะพยายามทำกระบวนการเซ็นชื่อใหม่เนื่องจากฉันไม่สามารถใช้คู่คีย์ที่สร้างขึ้นโดย BC ในภายหลัง ฉันจะต้องใช้ vanity address แบบด่วนกับ mkp224o ที่สร้างคีย์ขยายขนาด 64 ไบต์เช่น tor

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา