Heim >Backend-Entwicklung >Golang >Public-Key-Kryptographie: Der digitale Handschlag, Go Crypto 5

Public-Key-Kryptographie: Der digitale Handschlag, Go Crypto 5

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-29 09:08:301076Durchsuche

Public-Key Cryptography: The Digital Handshake, 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!

RSA: Der Urvater der Public-Key-Kryptowährung

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.

RSA-Schlüsselgenerierung: Ihre digitale Identität

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)
}

RSA-Verschlüsselung und -Entschlüsselung: Weitergabe geheimer Notizen

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-Signatur und -Verifizierung: Ihre digitale Signatur

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!")
    }
}

Elliptische Kurvenkryptographie (ECC): Der Neue auf dem Markt

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.

ECDSA-Schlüsselgenerierung: Ihre elliptische Identität

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)
}

ECDSA-Signierung und -Verifizierung: Kurvige Signaturen

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)
}

Schlüsselverwaltung: Schützen Sie Ihre digitale Identität

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)
}

Die goldenen Regeln der Public-Key-Kryptographie

Da Sie nun mit diesen leistungsstarken Krypto-Tools arbeiten, sollten Sie die folgenden goldenen Regeln im Hinterkopf behalten:

  1. 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.

  2. 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.

  3. Rotieren Sie Ihre Schlüssel: So wie Sie Ihre Passwörter ändern, wechseln Sie auch Ihre Schlüssel regelmäßig.

  4. 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.

  5. 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.

  6. Hash vor dem Signieren: Signieren Sie beim Signieren großer Datenmengen den Hash, nicht die Daten selbst. Es ist schneller und genauso sicher.

  7. Leistung ist wichtig: Public-Key-Vorgänge können langsam sein, insbesondere RSA. Setzen Sie sie mit Bedacht ein.

Was kommt als nächstes?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn