Golang如何实现简单的文件加密_Golang文件加密与解密实践

使用AES-CFB模式可实现Golang文件加密解密,密钥需16/24/32字节,IV随机生成并随密文存储,适合小文件处理。

在Golang中实现简单的文件加密与解密,可以使用对称加密算法如AES(Advanced Encryption Standard)。这种方式适合保护本地文件或在网络传输前加密内容。下面介绍如何用AES-CFB模式完成文件的加密和解密操作。

AES对称加密简介

AES是一种广泛使用的加密标准,支持128、192和256位密钥长度。选择CFB(Cipher Feedback)模式是因为它能将块加密算法转化为流加密,适合处理任意长度的数据,且不需要填充(padding),比CBC更灵活。

生成密钥与初始化向量(IV)

加密需要一个固定长度的密钥和每次加密都不同的IV来保证安全性。

  • 密钥应为16字节(AES-128)、24字节(AES-192)或32字节(AES-256)
  • IV长度固定为16字节,需随机生成并在解密时提供
  • 不要硬编码密钥或IV,生产环境建议使用密钥管理系统

文件加密实现

以下代码演示如何读取原始文件并输出加密后的内容到新文件:

func encryptFile(filePath, encryptedPath, key string) error {
    plaintext, err := os.ReadFile(filePath)
    if err != nil {
        return err
    }

    block, err := aes.NewCipher([]byte(key))
    if err != nil {
        return err
    }

    ciphertext := make([]byte, aes.BlockSize+len(plaintext))
    iv := ciphertext[:aes.BlockSize]
    if _, err := io.ReadFull(rand.Reader, iv); err != nil {
        return err
    }

    stream := cipher.NewCFBEncrypter(block, iv)
    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)

    return os.WriteFile(encryptedPath, ciphertext, 0644)
}

文件解密实现

从加密文件中读取IV并还原原始数据:

func decryptFile(encryptedPath, decryptedPath, key string) error {
    data, err := os.ReadFile(encryptedPath)
    if err != nil {
        return err
    }

    block, err := aes.NewCipher([]byte(key))
    if err != nil {
        return err
    }

    if len(data) < aes.BlockSize {
        return errors.New("ciphertext too short")
    }

    iv := data[:aes.BlockSize]
    ciphertext := data[aes.BlockSize:]

    stream := cipher.NewCFBDecrypter(block, iv)
    stream.XORKeyStream(ciphertext, ciphertext)

    return os.WriteFile(decryptedPath, ciphertext, 0644)
}

使用示例

确保密钥长度正确(例如使用32字节的字符串作为AES-256密钥):

key := "thisis32bitlongpassphraseimusing" // 32字节
err := encryptFile("plain.txt", "encrypted.dat", key)
if err != nil {
    log.Fatal(err)
}

err = decryptFile("encrypted.dat", "decrypted.txt", key)
if err != nil {
    log.Fatal(err)
}
注意:

该方法适用于小文件加密。大文件建议采用分块读写避免内存溢出;同时密钥管理要谨慎,不可泄露。若需更高安全级别,可结合HMAC验证完整性,或使用公钥加密体系传输对称密钥。

基本上就这些。简单场景下,AES-CFB加随机IV足以满足基本的文件保密需求。