Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penyulitan Symmetric: Jabat Tangan Rahsia Kriptografi, Go Crypto 4

Penyulitan Symmetric: Jabat Tangan Rahsia Kriptografi, Go Crypto 4

Patricia Arquette
Patricia Arquetteasal
2024-10-20 06:07:30596semak imbas

Symmetric Encryption: The Secret Handshake of Cryptography, Go Crypto 4

Hai, peminat crypto! Bersedia untuk menyelami dunia penyulitan simetri? Anggap ia sebagai jabat tangan rahsia dunia digital - satu cara untuk dua pihak berkongsi maklumat yang hanya mereka boleh fahami. Mari kita pecahkan dan lihat cara Go membantu kami melaksanakan jabat tangan rahsia digital ini!

Block Ciphers: The Building Blocks

Pertama sekali, kami mempunyai sifir blok. Ini seperti roda sifir zaman digital - ia berfungsi pada ketulan data bersaiz tetap. Bintang rancangan di sini ialah AES (Standard Penyulitan Lanjutan).

AES: Juara Heavyweight

AES adalah seperti pisau penyulitan Tentera Swiss - ia serba boleh, kuat dan digunakan secara meluas. Begini cara anda menyediakannya dalam Go:

import (
    "crypto/aes"
    "crypto/rand"
    "fmt"
)

func main() {
    // Let's create a 256-bit key (32 bytes)
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Oops, the universe's randomness machine broke!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES threw a tantrum!")
    }

    fmt.Printf("Our AES block size: %d bytes\n", block.BlockSize())
}

Ini menyediakan AES, tetapi ingat, sifir blok sahaja adalah seperti kereta tanpa roda - berfungsi, tetapi belum begitu berguna lagi. Di situlah mod operasi masuk, tetapi kita akan melakukannya sedikit masa lagi.

Sifir Aliran: Sungai Penyulitan yang Mengalir

Seterusnya, kami mempunyai sifir strim. Ini seperti aliran bit yang kelihatan rawak yang tidak berkesudahan yang kami XOR dengan data kami untuk menyulitkannya. Go memberi kami ChaCha20, sifir strim moden yang pantas.

ChaCha20: Kanak-kanak Baru di Blok

Begini cara anda menggunakan ChaCha20:

import (
    "fmt"
    "golang.org/x/crypto/chacha20"
)

func main() {
    key := make([]byte, chacha20.KeySize)
    nonce := make([]byte, chacha20.NonceSize)

    cipher, err := chacha20.NewUnauthenticatedCipher(key, nonce)
    if err != nil {
        panic("ChaCha20 isn't feeling chatty today!")
    }

    secretMessage := []byte("ChaCha20 is my new dance move!")
    encrypted := make([]byte, len(secretMessage))
    cipher.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our secret dance move, encrypted: %x\n", encrypted)
}

ChaCha20 hebat apabila anda memerlukan kelajuan, terutamanya pada platform tanpa pecutan perkakasan AES.

Mod Operasi: Menyatukan Semuanya

Sekarang, mari bercakap tentang mod operasi. Ini seperti peraturan permainan - ia menentukan cara kami menggunakan sifir kami untuk menyulitkan data dengan selamat.

GCM (Mod Galois/Counter): Pisau Tentera Swiss

GCM adalah seperti pisau Swiss Army bagi mod penyulitan. Ia memberikan kedua-dua kerahsiaan dan integriti, itulah sebabnya ia sangat disyorkan untuk kebanyakan kes penggunaan. Begini cara anda menggunakannya:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("The random number generator went on strike!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having an existential crisis!")
    }

    nonce := make([]byte, 12)
    if _, err := rand.Read(nonce); err != nil {
        panic("Nonce generator is feeling noncommittal!")
    }

    aesgcm, err := cipher.NewGCM(block)
    if err != nil {
        panic("GCM mode is feeling moody!")
    }

    secretMessage := []byte("AES-GCM: Making encryption great again!")
    encrypted := aesgcm.Seal(nil, nonce, secretMessage, nil)

    fmt.Printf("Our encrypted message: %x\n", encrypted)

    // Let's decrypt it to make sure it worked
    decrypted, err := aesgcm.Open(nil, nonce, encrypted, nil)
    if err != nil {
        panic("Decryption failed! Did someone tamper with our message?")
    }

    fmt.Printf("Decrypted message: %s\n", decrypted)
}

CTR (Mod Balas): The Streamifier

Mod CTR adalah seperti tongkat ajaib yang menukar sifir blok menjadi sifir strim. Ia berguna apabila anda memerlukan fleksibiliti sifir strim tetapi mahu kekal dengan algoritma sifir blok:

import (
    "crypto/aes"
    "crypto/cipher"
    "crypto/rand"
    "fmt"
)

func main() {
    key := make([]byte, 32)
    if _, err := rand.Read(key); err != nil {
        panic("Random number generator is feeling random about its job!")
    }

    block, err := aes.NewCipher(key)
    if err != nil {
        panic("AES is having a block party, and we're not invited!")
    }

    iv := make([]byte, aes.BlockSize)
    if _, err := rand.Read(iv); err != nil {
        panic("IV generator is feeling too independent!")
    }

    stream := cipher.NewCTR(block, iv)

    secretMessage := []byte("CTR mode: Turning blocks into streams since 1979!")
    encrypted := make([]byte, len(secretMessage))
    stream.XORKeyStream(encrypted, secretMessage)

    fmt.Printf("Our streamed secret: %x\n", encrypted)

    // Let's decrypt it
    decrypted := make([]byte, len(encrypted))
    stream = cipher.NewCTR(block, iv) // Reset the stream
    stream.XORKeyStream(decrypted, encrypted)

    fmt.Printf("Decrypted message: %s\n", decrypted)
}

Peraturan Emas Penyulitan Simetri

Sekarang anda mempunyai alat penyulitan baharu yang berkilat ini, berikut ialah beberapa peraturan emas yang perlu diingat:

  1. GCM ialah rakan anda: Untuk kebanyakan kes, gunakan AES-GCM. Ia seperti pengawal peribadi untuk data anda - ia melindungi kedua-dua kerahsiaan dan integriti.

  2. Nonce adalah rempah ratus kehidupan: Sentiasa gunakan nonce unik (nombor digunakan sekali) untuk setiap operasi penyulitan. Ia seperti pengecam unik untuk setiap mesej rahsia.

  3. Rawak adalah kunci: Jana kunci anda menggunakan crypto/rand. Menggunakan kekunci lemah adalah seperti menggunakan "kata laluan123" untuk akaun bank anda.

  4. CTR memerlukan rakan: Jika anda menggunakan mod CTR, ingat ia tidak melindungi integriti. Pertimbangkan untuk memasangkannya dengan MAC jika anda memerlukan perlindungan integriti.

  5. Pengendalian ralat bukan pilihan: Sentiasa kendalikan ralat, terutamanya semasa penjanaan dan permulaan kunci. Mengabaikan ralat dalam kod crypto adalah seperti mengabaikan lampu "Check Engine" pada kereta anda.

  6. Rahsiakan rahsia anda: Jangan sekali-kali, kunci kod keras dalam kod sumber anda. Ia seperti menyembunyikan kunci rumah anda di bawah tikar alu-aluan - tempat pertama penyerang akan kelihatan!

Apa Seterusnya?

Tahniah! Anda baru sahaja menambahkan penyulitan simetri pada kit alat kriptografi anda. Teknik ini bagus untuk mendapatkan data apabila kedua-dua pihak berkongsi kunci rahsia.

Tetapi bagaimana jika anda perlu mewujudkan sambungan selamat dengan seseorang yang tidak pernah anda temui sebelum ini? Di situlah kriptografi kunci awam masuk, yang akan kita terokai dalam bahagian seterusnya. Ia seperti perbezaan antara jabat tangan rahsia dan tandatangan awam - kedua-duanya berguna, tetapi untuk senario yang berbeza.

Ingat, dalam dunia kriptografi, memahami asas ini adalah penting. Ia seperti belajar untuk mengunci pintu anda sebelum anda membina sebuah istana. Kuasai ini dan anda akan berjaya mencipta aplikasi yang selamat dan mantap dalam Go.

Jadi, bagaimana pula jika anda cuba menyulitkan mesej kepada diri sendiri? Atau mungkin melaksanakan aplikasi pengambilan nota selamat yang mudah menggunakan AES-GCM? Dunia komunikasi selamat berada di hujung jari anda! Selamat mengekod, juara kripto!

Atas ialah kandungan terperinci Penyulitan Symmetric: Jabat Tangan Rahsia Kriptografi, Go Crypto 4. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn