为了账号安全,请及时绑定邮箱和手机立即绑定

使用crypto/aes lib的Golang文件加密

使用crypto/aes lib的Golang文件加密

Go
跃然一笑 2021-11-01 17:18:42
我正在尝试使用 Go crypto/aes 包加密文件。我到目前为止:func encrypt(source string, localdir string) error {    src := filepath.Join("/home/bacula/cloud-backup/"+localdir, source)    dst := filepath.Join(src + ".aes")    fmt.Println(src)    fmt.Println(dst)    key := []byte("example key 1234")    iv := []byte(key)[:aes.BlockSize]    aesBlockEncrypter, err := aes.NewCipher([]byte(key))    if err != nil {            return err    }    aesEncrypter := cipher.NewCFBEncrypter(aesBlockEncrypter, iv)    aesEncrypter.XORKeyStream([]byte(dst), []byte(src))    return nil}我的第一个问题是,如何改进生成 IV 的方式?其次,没有输出文件,那么如何通过 XORKeyStream 流式传输文件?
查看完整描述

1 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

crypto/cipher包文档中有一个示例。


我已经调整了示例为您制作了新示例:


func main() {

    // read content from your file

    plaintext, err := ioutil.ReadFile("you_file_to_be_encrypted")

    if err != nil {

        panic(err.Error())

    }


    // this is a key

    key := []byte("example key 1234")


    block, err := aes.NewCipher(key)

    if err != nil {

        panic(err)

    }


    // The IV needs to be unique, but not secure. Therefore it's common to

    // include it at the beginning of the ciphertext.

    ciphertext := make([]byte, aes.BlockSize+len(plaintext))

    iv := ciphertext[:aes.BlockSize]

    if _, err := io.ReadFull(rand.Reader, iv); err != nil {

        panic(err)

    }


    stream := cipher.NewCFBEncrypter(block, iv)

    stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)


    // create a new file for saving the encrypted data.

    f, err := os.Create("a_aes.txt")

    if err != nil {

        panic(err.Error())

    }

    _, err = io.Copy(f, bytes.NewReader(ciphertext))

    if err != nil {

        panic(err.Error())

    }


    // done

}


查看完整回答
反对 回复 2021-11-01
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信