Encrypt File

使用 aes256 算法加密解密文件

ReadFile And WriteFile

如果文件很小,可以直接使用 ReadFile 和 WriteFile 方法对文件加密或者解密。go

目录结构
.
├── icon.jpg
└── main.go
main.go
package main

import (
	helper_crypto_file "github.com/langwan/langgo/helpers/crypto/file"
	"os"
)

func main() {
	key := []byte("01234567890123456789012345678901")
	data, err := os.ReadFile("./icon.jpg")
	if err != nil {
		return
	}
	helper_crypto_file.WriteFile(key, "./dst.jpg.en", data, 0666)

	de, err := helper_crypto_file.ReadFile(key, "./dst.jpg.en")
	if err != nil {
		return
	}
	os.WriteFile("./dst.jpg", de, 0666)
}
目录结构(输出)
.
├── dst.jpg
├── dst.jpg.en
├── icon.jpg
└── main.go

使用缓存

当文件比较大,可以使用缓存来读写加密文件。

main.go
package main

import (
	"fmt"
	helper_crypto_file "github.com/langwan/langgo/helpers/crypto/file"
	"io"
	"os"
	"time"
)

func main() {
	encryptedFile("01234567890123456789012345678901", "./icon.jpg", "./dst.jpg", "./dst.jpg.en")
}

func encryptedFile(key string, src string, dst string, en string) {

	st := time.Now()

	defer func() {
		fmt.Println("runtime", time.Since(st))
	}()

	os.Remove(en)
	os.Remove(dst)

	cf := helper_crypto_file.File{
		Secret: []byte(key),
	}
	fd, err := os.Open(src)
	defer fd.Close()
	if err != nil {
		panic(err)
	}
	err = cf.Create(en)
	if err != nil {
		panic(err)
	}
	buf := make([]byte, helper_crypto_file.DefaultBufferSize)
	rn := 0
	wn := 0
	i := 0
	for {
		n, err := fd.ReadAt(buf, int64(rn))

		i++
		rn += n
		if n == 0 {
			break
		} else if err != nil && err != io.EOF {

			panic(err)
		}
		n, err = cf.WriteAt(buf[:n], int64(wn))

		if err != nil {
			panic(err)
		}
		wn += n
	}

	cf.Close()

	cf = helper_crypto_file.File{
		Secret: []byte("01234567890123456789012345678901"),
	}
	cf.Open(en)
	defer cf.Close()

	fd, err = os.Create(dst)
	if err != nil {
		panic(err)
	}
	defer fd.Close()
	buf = make([]byte, helper_crypto_file.DefaultBlockSize)
	rn = 0
	wn = 0

	i = 0
	for {
		de, n, err := cf.ReadAt(buf, int64(rn))

		i++
		rn += n
		if n == 0 {
			break
		} else if err != nil && err != io.EOF {

			panic(err)
		}
		n, err = fd.WriteAt(de, int64(wn))

		if err != nil {
			panic(err)
		}
		wn += n
	}
}

Last updated