Encrypt File

The aes256 algorithm was used to encrypt and decrypt the file

ReadFile And WriteFile

When the file size is small, readfile and writefile are used directly to read and write the encrypted file.

file system
.
├── 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)
}
file system (output)
.
├── dst.jpg
├── dst.jpg.en
├── icon.jpg
└── main.go

Read And Write File By Buffer

When the file size is large, you can use the cache to read and write encrypted files.

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