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

在Golang中实现简单的文件加密与解密,可以使用对称加密算法如AES(Advanced Encryption Standard)。这种方式适合保护本地文件或在网络传输前加密内容。下面介绍如何用AES-CFB模式完成文件的加密和解密操作。
AES是一种广泛使用的加密标准,支持128、192和256位密钥长度。选择CFB(Cipher Feedback)模式是因为它能将块加密算法转化为流加密,适合处理任意长度的数据,且不需要填充(padding),比CBC更灵活。
加密需要一个固定长度的密钥和每次加密都不同的IV来保证安全性。
以下代码演示如何读取原始文件并输出加密后的内容到新文件:
立即学习“go语言免费学习笔记(深入)”;
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足以满足基本的文件保密需求。
以上就是Golang如何实现简单的文件加密_Golang文件加密与解密实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号