


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.
- 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. - 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
对象,然后指定了要加密和解密的文件列表,并以并发方式进行加密和解密操作。
在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. - Akhir sekali, dalam fungsi
utama
, kami menggunakan fungsifilepath.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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

GO Pointer Syntax dan menangani masalah dalam penggunaan perpustakaan Viper semasa pengaturcaraan dalam bahasa Go, adalah penting untuk memahami sintaks dan penggunaan petunjuk, terutama dalam ...
