Maison > développement back-end > Golang > le corps du texte

Comment gérer le cryptage et le déchiffrement des fichiers simultanés en langage Go ?

WBOY
Libérer: 2023-10-09 09:15:53
original
698 Les gens l'ont consulté

Comment gérer le cryptage et le déchiffrement des fichiers simultanés en langage Go ?

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.

  1. Connaissances de base en cryptographie :
    Avant de crypter et de décrypter des fichiers, nous devons comprendre certaines connaissances de base en cryptographie. Les algorithmes de chiffrement symétriques courants incluent DES, 3DES, AES, etc., tandis que les algorithmes de chiffrement asymétriques incluent RSA, DSA, etc. Dans cet article, nous prenons l'algorithme AES comme exemple pour l'expliquer en détail.
  2. Exemple de code d'implémentation :
    Ce qui suit est un exemple de code d'implémentation simple pour crypter et déchiffrer 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.")
}
Copier après la connexion

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对象,然后指定了要加密和解密的文件列表,并以并发方式进行加密和解密操作。

encryptFiledecryptFile函数中,我们首先打开输入文件和输出文件,然后创建一个AES块,并使用16字节IV对其进行初始化。接下来,我们将生成的流与输入文件或输出文件进行关联,然后使用io.Copy函数复制数据,完成文件加密和解密的操作。

最后,在main函数中,我们使用filepath.Join

Dans les fonctions 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.
  1. Enfin, dans la fonction 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.
Conclusion : 🎜En gérant les problèmes de cryptage et de décryptage de fichiers dans le langage Go de manière simultanée, plusieurs fichiers peuvent être traités en même temps pour améliorer l'efficacité du traitement. Dans cet article, nous prenons l'algorithme AES comme exemple et introduisons un exemple de code d'implémentation simple pour montrer comment utiliser la concurrence pour les opérations de chiffrement et de décryptage de fichiers. J'espère que cet article sera utile aux lecteurs lorsqu'ils traiteront de problèmes simultanés de cryptage et de déchiffrement de fichiers dans le langage Go. 🎜🎜

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal