推荐使用AES对称加密算法实现Golang文件加解密,核心步骤包括:读取文件内容,用密钥和随机IV在CBC模式下加密,需进行PKCS7填充以满足块大小要求;加密时生成IV并连同密文一并存储,解密时先读取IV再还原数据。关键点:使用crypto/aes和crypto/cipher包,密钥长度支持16、24、32字节,IV必须随机且与密文一同保存,避免硬编码密钥,可扩展HMAC或GCM增强安全性。

在Golang中实现文件的加密和解密,推荐使用对称加密算法如AES(Advanced Encryption Standard),它安全、高效,适合大文件处理。核心思路是:读取文件内容,用密钥加密后保存为新文件;解密时读取加密文件,用相同密钥还原原始内容。
AES加密模式与填充
AES通常使用CBC(Cipher Block Chaining)模式,需要初始化向量(IV)来增强安全性。由于AES是分组加密(块大小16字节),数据长度必须是块大小的整数倍,不足时需进行PKCS7填充。
关键点:
使用crypto/aes和crypto/cipher包密钥长度支持16、24、32字节(对应AES-128、AES-192、AES-256)IV应随机生成并随密文一起存储
加密文件实现步骤
以下是将文件加密为二进制格式的示例代码:
立即学习“go语言免费学习笔记(深入)”;
func encryptFile(inputPath, outputPath string, key []byte) error { plaintext, err := os.ReadFile(inputPath) if err != nil { return err }block, err := aes.NewCipher(key)if err != nil { return err}// 生成随机IViv := make([]byte, aes.BlockSize)if _, err := io.ReadFull(rand.Reader, iv); err != nil { return err}// 填充plaintext = pkcs7Padding(plaintext, aes.BlockSize)ciphertext := make([]byte, len(plaintext))mode := cipher.NewCBCEncrypter(block, iv)mode.CryptBlocks(ciphertext, plaintext)// 写入IV + 密文file, err := os.Create(outputPath)if err != nil { return err}defer file.Close()file.Write(iv)file.Write(ciphertext)return nil
}
func pkcs7Padding(data []byte, blockSize int) []byte {padding := blockSize - len(data)%blockSizepadtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(data, padtext...)}
解密文件实现步骤
从加密文件中读取IV和密文,执行解密并还原原始数据:
func decryptFile(inputPath, outputPath string, key []byte) error { data, err := os.ReadFile(inputPath) if err != nil { return err }block, err := aes.NewCipher(key)if err != nil { return err}if len(data) < aes.BlockSize { return errors.New("密文太短")}iv := data[:aes.BlockSize]ciphertext := data[aes.BlockSize:]if len(ciphertext)%aes.BlockSize != 0 { return errors.New("密文长度不合法")}mode := cipher.NewCBCDecrypter(block, iv)plaintext := make([]byte, len(ciphertext))mode.CryptBlocks(plaintext, ciphertext)// 去除PKCS7填充plaintext, err = pkcs7Unpad(plaintext)if err != nil { return err}return os.WriteFile(outputPath, plaintext, 0644)
}
func pkcs7Unpad(data []byte) ([]byte, error) {length := len(data)if length == 0 {return nil, errors.New("空数据")}unpad := int(data[length-1])if unpad > length {return nil, errors.New("无效填充")}return data[:length-unpad], nil}
使用示例
调用上述函数进行加解密操作:
key := []byte("your-32-byte-secret-key-here!!!") // 必须是32字节// 加密err := encryptFile("test.txt", "encrypted.dat", key)if err != nil {log.Fatal(err)}
// 解密err = decryptFile("encrypted.dat", "decrypted.txt", key)if err != nil {log.Fatal(err)}
基本上就这些。注意密钥要妥善保管,不要硬编码在代码中。对于更复杂场景,可结合hmac做完整性校验,或使用gcm模式实现认证加密。整个过程不复杂但容易忽略IV管理与填充细节。
以上就是如何在Golang中实现文件加密解密的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1415251.html
微信扫一扫
支付宝扫一扫