Heim >Backend-Entwicklung >Golang >Public-Key-Kryptographie: Der digitale Handschlag, Go Crypto 5
Hallo, Krypto-Explorer! Sind Sie bereit, in die faszinierende Welt der Public-Key-Kryptographie einzutauchen? Betrachten Sie es als das digitale Äquivalent eines geheimen Händedrucks, den Sie in der Öffentlichkeit durchführen können. Klingt unmöglich? Lassen Sie uns es aufschlüsseln und sehen, wie Go uns dabei hilft, diesen kryptografischen Zaubertrick umzusetzen!
Zuerst haben wir RSA (Rivest-Shamir-Adleman). Es ist wie der weise alte Großvater der Public-Key-Systeme – es gibt sie schon seit Ewigkeiten und sie sind immer noch erfolgreich.
Beginnen wir mit der Erstellung unserer RSA-Schlüssel:
import ( "crypto/rand" "crypto/rsa" "fmt" ) func main() { // Let's make a 2048-bit key. It's like choosing a really long password! privateKey, err := rsa.GenerateKey(rand.Reader, 2048) if err != nil { panic("Oops! Our key generator is feeling shy today.") } publicKey := &privateKey.PublicKey fmt.Println("Tada! We've got our keys. Keep the private one secret!") fmt.Printf("Private Key: %v\n", privateKey) fmt.Printf("Public Key: %v\n", publicKey) }
Nun verwenden wir diese Tasten, um eine geheime Nachricht zu senden:
import ( "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt" ) func main() { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey secretMessage := []byte("RSA is like a magic envelope!") // Encryption - Sealing our magic envelope ciphertext, err := rsa.EncryptOAEP( sha256.New(), rand.Reader, publicKey, secretMessage, nil, ) if err != nil { panic("Our magic envelope got stuck!") } fmt.Printf("Our secret message, encrypted: %x\n", ciphertext) // Decryption - Opening our magic envelope plaintext, err := rsa.DecryptOAEP( sha256.New(), rand.Reader, privateKey, ciphertext, nil, ) if err != nil { panic("Uh-oh, we can't open our own envelope!") } fmt.Printf("Decrypted message: %s\n", plaintext) }
RSA ist nicht nur für geheime Nachrichten gedacht. Es können auch digitale Signaturen erstellt werden:
import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "fmt" ) func main() { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey message := []byte("I solemnly swear that I am up to no good.") hash := sha256.Sum256(message) // Signing - Like signing a digital contract signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:]) if err != nil { panic("Our digital pen ran out of ink!") } fmt.Printf("Our digital signature: %x\n", signature) // Verification - Checking if the signature is genuine err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hash[:], signature) if err != nil { fmt.Println("Uh-oh, this signature looks fishy!") } else { fmt.Println("Signature checks out. Mischief managed!") } }
Lassen Sie uns nun über ECC sprechen. Es ist wie der coolere, effizientere Cousin von RSA. Es bietet eine ähnliche Sicherheit mit kleineren Schlüsseln, was ideal für Mobil- und IoT-Geräte ist.
Lassen Sie uns unsere ECC-Schlüssel erstellen:
import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "fmt" ) func main() { privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { panic("Our elliptic curve generator took a wrong turn!") } publicKey := &privateKey.PublicKey fmt.Println("Voila! Our elliptic curve keys are ready.") fmt.Printf("Private Key: %v\n", privateKey) fmt.Printf("Public Key: %v\n", publicKey) }
Jetzt unterschreiben wir etwas mit unseren Ellipsentasten:
import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" "crypto/sha256" "fmt" ) func main() { privateKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) publicKey := &privateKey.PublicKey message := []byte("Elliptic curves are mathematically delicious!") hash := sha256.Sum256(message) // Signing - Like signing with a very curvy pen r, s, err := ecdsa.Sign(rand.Reader, privateKey, hash[:]) if err != nil { panic("Our curvy signature got a bit too curvy!") } fmt.Printf("Our elliptic signature: (r=%x, s=%x)\n", r, s) // Verification - Checking if our curvy signature is legit valid := ecdsa.Verify(publicKey, hash[:], r, s) fmt.Printf("Is our curvy signature valid? %v\n", valid) }
Lassen Sie uns nun über die sichere Aufbewahrung dieser Schlüssel sprechen. Es ist, als hätte man einen wirklich wichtigen Schlüssel zu einer wirklich wichtigen Tür – man möchte ihn sicher aufbewahren!
import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "fmt" ) func main() { privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) // Encoding our private key - Like putting it in a special envelope privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey) privateKeyPEM := pem.EncodeToMemory(&pem.Block{ Type: "RSA PRIVATE KEY", Bytes: privateKeyBytes, }) fmt.Printf("Our key in its special envelope:\n%s\n", privateKeyPEM) // Decoding our private key - Taking it out of the envelope block, _ := pem.Decode(privateKeyPEM) decodedPrivateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { panic("We forgot how to open our own envelope!") } fmt.Printf("Our key, safe and sound: %v\n", decodedPrivateKey) }
Da Sie nun mit diesen leistungsstarken Krypto-Tools arbeiten, sollten Sie die folgenden goldenen Regeln im Hinterkopf behalten:
Auf die Größe kommt es an: Gehen Sie für RSA groß oder gehen Sie nach Hause – mindestens 2048 Bit. Für ECC sind 256 Bit der Sweet Spot.
Zufall ist dein Freund: Verwenden Sie immer Krypto/Rand für die Schlüsselgenerierung. Die Verwendung schwacher Zufälligkeit ist wie die Verwendung von „password123“ als Schlüssel.
Rotieren Sie Ihre Schlüssel: So wie Sie Ihre Passwörter ändern, wechseln Sie auch Ihre Schlüssel regelmäßig.
Standardformate sind aus gutem Grund Standard: Verwenden Sie PEM zum Speichern und Senden von Schlüsseln. Es ist wie mit einem Standardumschlag – jeder weiß, wie man damit umgeht.
Padding ist nicht nur für Möbel geeignet: Verwenden Sie für die RSA-Verschlüsselung immer OAEP-Padding. Es ist wie Luftpolsterfolie für Ihre verschlüsselten Daten.
Hash vor dem Signieren: Signieren Sie beim Signieren großer Datenmengen den Hash, nicht die Daten selbst. Es ist schneller und genauso sicher.
Leistung ist wichtig: Public-Key-Vorgänge können langsam sein, insbesondere RSA. Setzen Sie sie mit Bedacht ein.
Herzlichen Glückwunsch! Sie haben gerade die Public-Key-Kryptografie zu Ihrem Toolkit hinzugefügt. Diese Techniken eignen sich perfekt für sichere Kommunikation, digitale Signaturen und den Aufbau von Vertrauen im Wilden Westen des Internets.
Als nächstes werden wir uns eingehender mit digitalen Signaturen und ihren Anwendungen befassen. Es ist, als würde man lernen, seinen Namen auf eine Weise zu schreiben, die man nicht fälschen kann – ziemlich cool, oder?
Denken Sie daran, dass es in der Welt der Kryptographie von entscheidender Bedeutung ist, diese Grundlagen zu verstehen. Es ist, als würde man die Verkehrsregeln kennen lernen, bevor man losfährt. Wenn Sie diese beherrschen, sind Sie auf dem besten Weg, sichere, robuste Anwendungen in Go zu erstellen.
Wie wäre es also, wenn Sie versuchen würden, eine Nachricht für einen Freund mit seinem öffentlichen Schlüssel zu verschlüsseln? Oder vielleicht ein einfaches digitales Signatursystem implementieren? Die Welt der sicheren, authentifizierten Kommunikation steht Ihnen zur Verfügung! Viel Spaß beim Codieren, Krypto-Champion!
Das obige ist der detaillierte Inhalt vonPublic-Key-Kryptographie: Der digitale Handschlag, Go Crypto 5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!