"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية التوفيق بين التناقض بين تنسيقات المفاتيح الخاصة Golang وBittorrent لـ Ed25519؟

كيفية التوفيق بين التناقض بين تنسيقات المفاتيح الخاصة Golang وBittorrent لـ Ed25519؟

تم النشر بتاريخ 2024-11-08
تصفح:552

How to reconcile the discrepancy between Golang and Bittorrent private key formats for Ed25519?

ed25519. تباين النتائج العامة

تنشأ المشكلة من تنسيقات مختلفة للمفاتيح الخاصة ed25519. يبدأ المفتاح كبذرة مكونة من 32 بايت يتم تجزئتها باستخدام SHA512 لإنشاء 64 بايت (يتم قلب بعض البتات أثناء هذه العملية).

تنسيق مفتاح Golang الخاص

يشتمل تنسيق المفتاح الخاص Golang على بذرة بحجم 32 بايت متسلسلة مع مفتاح عام بحجم 32 بايت مفتاح.

تنسيق مفتاح Bittorrent الخاص

مفاتيح Bittorrent الخاصة هي مخرجات 64 بايت من التجزئة أو من المحتمل أن تكون 64 بايت عشوائية فقط تستخدم بنفس الطريقة مثل نتيجة التجزئة.

تحويل مفاتيح Bittorrent إلى تنسيق Golang

لسوء الحظ، الأمر ليس كذلك من الممكن تحويل مفاتيح Bittorrent إلى تنسيق تقبله واجهة برمجة تطبيقات Golang لأن عملية التجزئة غير قابلة للعكس.

تنفيذ Golang مخصص لمتجهات الاختبار

لمعالجة هذه المشكلة، نسخة معدلة من مكتبة Golang مبنية على الحزمة الداخلية golang.org/x/crypto/ed25519/internal/edwards25519 يمكن إنشاء:

وظيفة إنشاء مفتاح عام من مفتاح خاص

func getPublicKey(privateKey []byte) []byte { var A edwards25519.ExtendingGroupElement فار hBytes [32] بايت نسخة (hBytes[:]، مفتاح خاص) edwards25519.GeScalarMultBase(&A, &hBytes) فار publicKeyBytes [32] بايت A.ToBytes(&publicKeyBytes) إرجاع publicKeyBytes[:]
func getPublicKey(privateKey []byte) []byte {
    var A edwards25519.ExtendedGroupElement
    var hBytes [32]byte
    copy(hBytes[:], privateKey)
    edwards25519.GeScalarMultBase(&A, &hBytes)
    var publicKeyBytes [32]byte
    A.ToBytes(&publicKeyBytes)

    return publicKeyBytes[:]
}
وظيفة إنشاء التوقيع

func Sign (privateKey، publicKey، message []byte) []byte { فار PrivateKeyA [32] بايت Copy(privateKeyA[:], PrivateKey) // نحتاج إلى هذا في مصفوفة لاحقًا var messageDigest, hramDigest [64] بايت ح := sha512.New () h.Write(privateKey[32:]) ح.اكتب (رسالة) h.Sum(messageDigest[:0]) فار messageDigestReduced [32] بايت edwards25519.ScReduce(&messageDigestReduced, &messageDigest) var R edwards25519.ExtendingGroupElement edwards25519.GeScalarMultBase(&R, &messageDigestReduced) فار مشفرR [32] بايت R.ToBytes(&encodedR) ح.إعادة تعيين () ح.الكتابة (المشفرةR[:]) ح.الكتابة (المفتاح العام) ح.اكتب (رسالة) h.Sum(hramDigest[:0]) var hramDigest تم تقليله [32] بايت edwards25519.ScReduce(&hramDigestReduced, &hramDigest) فار ق [32] بايت edwards25519.ScMulAdd(&s, &hramDigestReduced, &privateKeyA, &messageDigestReduced) التوقيع := جعل ([] بايت، 64) نسخة (التوقيع [:]، المشفرةR [:]) نسخة (التوقيع [32:]، ق [:]) توقيع العودة

func sign(privateKey, publicKey, message []byte) []byte {

    var privateKeyA [32]byte
    copy(privateKeyA[:], privateKey) // we need this in an array later
    var messageDigest, hramDigest [64]byte

    h := sha512.New()
    h.Write(privateKey[32:])
    h.Write(message)
    h.Sum(messageDigest[:0])

    var messageDigestReduced [32]byte
    edwards25519.ScReduce(&messageDigestReduced, &messageDigest)
    var R edwards25519.ExtendedGroupElement
    edwards25519.GeScalarMultBase(&R, &messageDigestReduced)

    var encodedR [32]byte
    R.ToBytes(&encodedR)

    h.Reset()
    h.Write(encodedR[:])
    h.Write(publicKey)
    h.Write(message)
    h.Sum(hramDigest[:0])
    var hramDigestReduced [32]byte
    edwards25519.ScReduce(&hramDigestReduced, &hramDigest)

    var s [32]byte
    edwards25519.ScMulAdd(&s, &hramDigestReduced, &privateKeyA, &messageDigestReduced)

    signature := make([]byte, 64)
    copy(signature[:], encodedR[:])
    copy(signature[32:], s[:])

    return signature
}

const PrivateKeyHex = "e06d3183d14159228433ed599221b80bd0a5ce8352e4bdf0262f76786ef1c74d b7e7a9fea2c0eb269d61e3b38e450a22e754941ac78479d6c54e1faf6037881d" const المتوقعPublicKey = "77ff84905a91936367c01360803104f92432fcd904a43511876df5cdf3e7e548" ثابت المتوقعSig = "6834284b6b24c3204eb2fea824d82f88883a3d95e8b4a21b8c0ded553d17d17d df9a8a7104b1258f30bed3787e6cb896fca78c58f8e03b5f18f14951a87d9a08" مفتاح خاص، _ := hex.DecodeString(privateKeyHex) publicKey:= getPublicKey(privateKey) keyMatches := المتوقعPublicKey == hex.EncodeToString(publicKey) sigMatches := المتوقعSig == hex.EncodeToString(sign(privateKey, publicKey, []byte("4:salt6:foobar3:seqi1e1:v12:Hello World!"))))

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3