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