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.
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
对象,然后指定了要加密和解密的文件列表,并以并发方式进行加密和解密操作。
在encryptFile
和decryptFile
函数中,我们首先打开输入文件和输出文件,然后创建一个AES块,并使用16字节IV对其进行初始化。接下来,我们将生成的流与输入文件或输出文件进行关联,然后使用io.Copy
函数复制数据,完成文件加密和解密的操作。
最后,在main
函数中,我们使用filepath.Join
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. 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. 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!