Heim >Backend-Entwicklung >Golang >Wie gehe ich mit der Ver- und Entschlüsselung gleichzeitiger Dateien in der Go-Sprache um?
Wie gehe ich mit der Ver- und Entschlüsselung gleichzeitiger Dateien in der Go-Sprache um?
Einführung:
Mit der Entwicklung des Internets und der Popularität der Informationsübertragung sind Dateiverschlüsselung und -entschlüsselung zu wichtigen Mitteln zum Schutz der Datensicherheit geworden. Darüber hinaus steigt mit zunehmender Rechenleistung und Speicherkapazität des Computers auch die Notwendigkeit, mehrere Dateien gleichzeitig zu verarbeiten. In der Go-Sprache können wir die Parallelitätsfunktion verwenden, um Verschlüsselungs- und Entschlüsselungsvorgänge für mehrere Dateien gleichzeitig zu implementieren.
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.") }
Der obige Code implementiert ein Beispiel für die gleichzeitige Verarbeitung der Dateiverschlüsselung und -entschlüsselung. Im Beispiel definieren wir zunächst ein sync.WaitGroup
-Objekt, das auf den Abschluss aller gleichzeitigen Aufgaben wartet, geben dann die Liste der zu verschlüsselnden und zu entschlüsselnden Dateien an und führen gleichzeitig Verschlüsselungs- und Entschlüsselungsvorgänge durch . sync.WaitGroup
对象,然后指定了要加密和解密的文件列表,并以并发方式进行加密和解密操作。
在encryptFile
和decryptFile
函数中,我们首先打开输入文件和输出文件,然后创建一个AES块,并使用16字节IV对其进行初始化。接下来,我们将生成的流与输入文件或输出文件进行关联,然后使用io.Copy
函数复制数据,完成文件加密和解密的操作。
最后,在main
函数中,我们使用filepath.Join
encryptFile
und decryptFile
öffnen wir zunächst die Eingabedatei und die Ausgabedatei, erstellen dann einen AES-Block und initialisieren ihn mit einem 16-Byte-IV. Als Nächstes verknüpfen wir den generierten Stream mit der Eingabe- oder Ausgabedatei und verwenden dann die Funktion io.Copy
, um die Daten zu kopieren und die Dateiverschlüsselungs- und -entschlüsselungsvorgänge abzuschließen. main
die Funktion filepath.Join
, um den Dateipfad zu erstellen und gleichzeitige Verschlüsselungs- und Entschlüsselungsaufgaben zu starten. Warten Sie, bis alle Aufgaben abgeschlossen sind, und drucken Sie eine Erfolgsmeldung aus. Das obige ist der detaillierte Inhalt vonWie gehe ich mit der Ver- und Entschlüsselung gleichzeitiger Dateien in der Go-Sprache um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!