Comment gérer le cryptage et le déchiffrement de fichiers simultanés en langage Go ?
Introduction :
Avec le développement d'Internet et la popularité de la transmission d'informations, le cryptage et le décryptage de fichiers sont devenus des moyens importants pour protéger la sécurité des données. De plus, à mesure que la puissance de traitement informatique et la capacité de stockage augmentent, la nécessité de traiter plusieurs fichiers simultanément augmente. Dans le langage Go, nous pouvons utiliser la fonctionnalité de concurrence pour implémenter des opérations de cryptage et de décryptage de plusieurs fichiers en même temps.
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.") }
Le code ci-dessus implémente un exemple de traitement simultané de cryptage et de décryptage de fichiers. Dans l'exemple, nous définissons d'abord un objet sync.WaitGroup
qui attend la fin de toutes les tâches simultanées, puis spécifions la liste des fichiers à chiffrer et déchiffrer, et effectuons les opérations de chiffrement et de déchiffrement de manière simultanée. . sync.WaitGroup
对象,然后指定了要加密和解密的文件列表,并以并发方式进行加密和解密操作。
在encryptFile
和decryptFile
函数中,我们首先打开输入文件和输出文件,然后创建一个AES块,并使用16字节IV对其进行初始化。接下来,我们将生成的流与输入文件或输出文件进行关联,然后使用io.Copy
函数复制数据,完成文件加密和解密的操作。
最后,在main
函数中,我们使用filepath.Join
encryptFile
et decryptFile
, nous ouvrons d'abord le fichier d'entrée et le fichier de sortie, puis créons un bloc AES et l'initialisons avec un IV de 16 octets. Ensuite, nous associons le flux généré au fichier d'entrée ou au fichier de sortie, puis utilisons la fonction io.Copy
pour copier les données et terminer les opérations de cryptage et de décryptage du fichier. main
, nous utilisons la fonction filepath.Join
pour construire le chemin du fichier et démarrer des tâches de chiffrement et de décryptage simultanées. Attendez que toutes les tâches soient terminées et imprimez un message de réussite. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!