Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menangani penyulitan dan penyahsulitan fail serentak dalam bahasa Go?

Bagaimana untuk menangani penyulitan dan penyahsulitan fail serentak dalam bahasa Go?

WBOY
WBOYasal
2023-10-09 09:15:53734semak imbas

Bagaimana untuk menangani penyulitan dan penyahsulitan fail serentak dalam bahasa Go?

Bagaimana untuk menangani penyulitan dan penyahsulitan fail serentak dalam bahasa Go?

Pengenalan:
Dengan perkembangan Internet dan populariti penghantaran maklumat, penyulitan dan penyahsulitan fail telah menjadi cara penting untuk melindungi keselamatan data. Selain itu, apabila kuasa pemprosesan komputer dan kapasiti storan meningkat, keperluan untuk memproses berbilang fail secara serentak juga semakin meningkat. Dalam bahasa Go, kami boleh menggunakan ciri konkurensi untuk melaksanakan operasi penyulitan dan penyahsulitan berbilang fail pada masa yang sama.

  1. Pengetahuan asas kriptografi:
    Sebelum menyulitkan dan menyahsulit fail, kita perlu memahami beberapa pengetahuan asas kriptografi. Algoritma penyulitan simetri biasa termasuk DES, 3DES, AES, dsb., manakala algoritma penyulitan asimetri termasuk RSA, DSA, dsb. Dalam artikel ini, kami mengambil algoritma AES sebagai contoh untuk menerangkan secara terperinci.
  2. Contoh kod pelaksanaan:
    Berikut ialah contoh kod pelaksanaan mudah untuk menyulitkan dan menyahsulit berbilang fail pada masa yang sama:
package main

import (
    "crypto/aes"
    "crypto/cipher"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "sync"
)

// 加密文件
func encryptFile(inPath, outPath string, key []byte) error {
    inFile, err := os.Open(inPath)
    if err != nil {
        return err
    }
    defer inFile.Close()

    outFile, err := os.OpenFile(outPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
    if err != nil {
        return err
    }
    defer outFile.Close()

    block, err := aes.NewCipher(key)
    if err != nil {
        return err
    }

    iv := make([]byte, aes.BlockSize)
    stream := cipher.NewCTR(block, iv)

    writer := &cipher.StreamWriter{S: stream, W: outFile}
    if _, err := io.Copy(writer, inFile); err != nil {
        return err
    }

    return nil
}

// 解密文件
func decryptFile(inPath, outPath string, key []byte) error {
    inFile, err := os.Open(inPath)
    if err != nil {
        return err
    }
    defer inFile.Close()

    outFile, err := os.OpenFile(outPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
    if err != nil {
        return err
    }
    defer outFile.Close()

    block, err := aes.NewCipher(key)
    if err != nil {
        return err
    }

    iv := make([]byte, aes.BlockSize)
    stream := cipher.NewCTR(block, iv)

    reader := &cipher.StreamReader{S: stream, R: inFile}
    if _, err := io.Copy(outFile, reader); err != nil {
        return err
    }

    return nil
}

func main() {
    var wg sync.WaitGroup
    key := []byte("YOUR_KEY")

    // 要加密的文件列表
    files := []string{"file1.txt", "file2.txt", "file3.txt"}

    wg.Add(len(files))
    for _, file := range files {
        go func(f string) {
            defer wg.Done()
            inPath := filepath.Join("input", f)
            outPath := filepath.Join("output", "encrypted_"+f)

            if err := encryptFile(inPath, outPath, key); err != nil {
                fmt.Printf("Error encrypting file %s: %s
", inPath, err.Error())
            }
        }(file)
    }

    wg.Wait()

    // 要解密的文件列表
    files = []string{"encrypted_file1.txt", "encrypted_file2.txt", "encrypted_file3.txt"}

    wg.Add(len(files))
    for _, file := range files {
        go func(f string) {
            defer wg.Done()
            inPath := filepath.Join("output", f)
            outPath := filepath.Join("output", "decrypted_"+f[len("encrypted_"):])

            if err := decryptFile(inPath, outPath, key); err != nil {
                fmt.Printf("Error decrypting file %s: %s
", inPath, err.Error())
            }
        }(file)
    }

    wg.Wait()

    fmt.Println("All files encrypted and decrypted successfully.")
}

Kod di atas melaksanakan contoh pemprosesan serentak penyulitan dan penyahsulitan fail. Dalam contoh, kami mula-mula mentakrifkan objek sync.WaitGroup yang menunggu semua tugasan serentak selesai, kemudian nyatakan senarai fail yang akan disulitkan dan dinyahsulitkan serta melaksanakan operasi penyulitan dan penyahsulitan secara serentak . sync.WaitGroup对象,然后指定了要加密和解密的文件列表,并以并发方式进行加密和解密操作。

encryptFiledecryptFile函数中,我们首先打开输入文件和输出文件,然后创建一个AES块,并使用16字节IV对其进行初始化。接下来,我们将生成的流与输入文件或输出文件进行关联,然后使用io.Copy函数复制数据,完成文件加密和解密的操作。

最后,在main函数中,我们使用filepath.Join

Dalam fungsi encryptFile dan decryptFile, kami mula-mula membuka fail input dan fail output, kemudian mencipta blok AES dan memulakannya dengan IV 16-bait. Seterusnya, kami mengaitkan strim yang dijana dengan fail input atau fail output, dan kemudian gunakan fungsi io.Copy untuk menyalin data dan melengkapkan operasi penyulitan dan penyahsulitan fail.
  1. Akhir sekali, dalam fungsi utama, kami menggunakan fungsi filepath.Join untuk membina laluan fail dan memulakan tugas penyulitan dan penyahsulitan serentak. Tunggu sehingga semua tugasan selesai dan cetak mesej kejayaan.
Kesimpulan: 🎜Dengan mengendalikan masalah penyulitan dan penyahsulitan fail dalam bahasa Go secara serentak, berbilang fail boleh diproses pada masa yang sama dan kecekapan pemprosesan dipertingkatkan. Dalam artikel ini, kami mengambil algoritma AES sebagai contoh dan memperkenalkan contoh kod pelaksanaan mudah untuk menunjukkan cara menggunakan concurrency untuk operasi penyulitan dan penyahsulitan fail. Saya harap artikel ini akan membantu pembaca apabila menangani isu penyulitan dan penyahsulitan fail serentak dalam bahasa Go. 🎜🎜

Atas ialah kandungan terperinci Bagaimana untuk menangani penyulitan dan penyahsulitan fail serentak dalam bahasa Go?. 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