تخزين المفتاح الخاص لـ ECDSA في Go
عند العمل مع أزواج مفاتيح ECDSA في Go، تنشأ الحاجة إلى تخزين المفتاح الخاص بشكل آمن. في حين أن الأسلوب elliptic.Marshal يوفر تشفيرًا للمفتاح العام، إلا أنه لا يوجد ما يعادله للمفتاح الخاص. تستكشف هذه المقالة كيفية حفظ المفاتيح الخاصة وتحميلها في Go.
التشفير وفك التشفير
لتخزين المفتاح الخاص، من الضروري اعتماد نهج متعدد الخطوات يتضمن تشفير مفتاح ECDSA، والتشفير القياسي، وتنسيق الملف. تتضمن المجموعة الشائعة استخدام خوارزمية ECDSA لإنشاء المفاتيح، وX.509 للتشفير، وتنسيق PEM (البريد المعزز للخصوصية) للتخزين. ]يوضح مقتطف الكود التالي كيفية تشفير وفك تشفير مفاتيح ECDSA في Go:import ( "التشفير/ECDSA" "التشفير/الإهليلجي" "التشفير/الراند" "التشفير/x509" "الترميز / بيم" "إف إم تي" "يعكس" ) func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) { x509Encoded، _ := x509.MarshalECPrivateKey(privateKey) pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY"، البايتات: x509Encoded}) x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey) pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY"، البايتات: x509EncodedPub}) سلسلة الإرجاع (pemEncoded)، سلسلة (pemEncodedPub) } فك تشفير func (سلسلة pemEncoded، سلسلة pemEncodedPub) (*ecdsa.PrivateKey, *ecdsa.PublicKey) { كتلة، _ := pem.Decode([]byte(pemEncoded)) x509Encoded := block.Bytes مفتاح خاص، _ := x509.ParseECPrivateKey(x509Encoded) blockPub, _ := pem.Decode([]byte(pemEncodedPub)) x509EncodedPub := blockPub.Bytes genericPublicKey، _ := x509.ParsePKIXPublicKey(x509EncodedPub) publicKey := genericPublicKey.(*ecdsa.PublicKey) إرجاع المفتاح الخاص، المفتاح العام } اختبار الوظيفة () { مفتاح خاص، _ := ecdsa.GenerateKey(elliptic.P384()، rand.Reader) publicKey := &privateKey.PublicKey encPriv، encPub:= تشفير (privateKey، publicKey) fmt.Println(encPriv) fmt.Println(encPub) priv2، pub2: = فك التشفير (encPriv، encPub) إذا !reflect.DeepEqual(privateKey, priv2) { fmt.Println("المفاتيح الخاصة غير متطابقة.") } إذا !reflect.DeepEqual(publicKey, pub2) { fmt.Println("المفاتيح العامة غير متطابقة.") }في وظيفة الاختبار:
يتم إنشاء زوج مفاتيح خاص/عام جديد لـ ECDSA.
import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/x509" "encoding/pem" "fmt" "reflect" ) func encode(privateKey *ecdsa.PrivateKey, publicKey *ecdsa.PublicKey) (string, string) { x509Encoded, _ := x509.MarshalECPrivateKey(privateKey) pemEncoded := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509Encoded}) x509EncodedPub, _ := x509.MarshalPKIXPublicKey(publicKey) pemEncodedPub := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: x509EncodedPub}) return string(pemEncoded), string(pemEncodedPub) } func decode(pemEncoded string, pemEncodedPub string) (*ecdsa.PrivateKey, *ecdsa.PublicKey) { block, _ := pem.Decode([]byte(pemEncoded)) x509Encoded := block.Bytes privateKey, _ := x509.ParseECPrivateKey(x509Encoded) blockPub, _ := pem.Decode([]byte(pemEncodedPub)) x509EncodedPub := blockPub.Bytes genericPublicKey, _ := x509.ParsePKIXPublicKey(x509EncodedPub) publicKey := genericPublicKey.(*ecdsa.PublicKey) return privateKey, publicKey } func test() { privateKey, _ := ecdsa.GenerateKey(elliptic.P384(), rand.Reader) publicKey := &privateKey.PublicKey encPriv, encPub := encode(privateKey, publicKey) fmt.Println(encPriv) fmt.Println(encPub) priv2, pub2 := decode(encPriv, encPub) if !reflect.DeepEqual(privateKey, priv2) { fmt.Println("Private keys do not match.") } if !reflect.DeepEqual(publicKey, pub2) { fmt.Println("Public keys do not match.") } }
يتم فك تشفير السلاسل المشفرة لاستعادة المفاتيح الأصلية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3