Go 言語での同時ファイルの暗号化と復号化に対処するにはどうすればよいですか?
はじめに:
インターネットの発展と情報伝達の普及に伴い、ファイルの暗号化と復号化はデータのセキュリティを保護する重要な手段となっています。さらに、コンピュータの処理能力とストレージ容量が増加するにつれて、複数のファイルを同時に処理する必要性が増加しています。 Go 言語では、同時実行機能を使用して、複数のファイルの暗号化および復号化操作を同時に実装できます。
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.") }
上記のコードは、同時処理ファイルを実装します。暗号化と復号化の例。この例では、まず、すべての同時タスクが完了するのを待機する sync.WaitGroup
オブジェクトを定義し、次に暗号化および復号化するファイルのリストを指定し、暗号化と復号化の操作を並行して実行します。
encryptFile
関数と decryptFile
関数では、まず入力ファイルと出力ファイルを開き、次に AES ブロックを作成し、16 バイトの IV で初期化します。 。次に、生成されたストリームを入力ファイルまたは出力ファイルに関連付け、io.Copy
関数を使用してデータをコピーし、ファイルの暗号化と復号化の操作を完了します。
最後に、main
関数で、filepath.Join
関数を使用してファイル パスを構築し、同時暗号化タスクと復号化タスクを開始します。すべてのタスクが完了するまで待ち、成功メッセージを出力します。
以上がGo 言語で同時ファイルの暗号化と復号化をどのように処理するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。