首页 > 后端开发 > Golang > 正文

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

P粉602998670
发布: 2025-11-26 18:19:06
原创
336人浏览过
使用AES-CFB模式可实现Golang文件加密解密,密钥需16/24/32字节,IV随机生成并随密文存储,适合小文件处理。

golang如何实现简单的文件加密_golang文件加密与解密实践

在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,生产环境建议使用密钥管理系统

文件加密实现

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

立即学习go语言免费学习笔记(深入)”;

豆包AI编程
豆包AI编程

豆包推出的AI编程助手

豆包AI编程 1697
查看详情 豆包AI编程
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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号