|
|
- package Encryption
-
- import (
- "bytes"
- "crypto/aes"
- "crypto/cipher"
- "crypto/rand"
- "io"
- "io/ioutil"
- "os"
- )
-
- func EncryptData(password string, data []byte) ([]byte, error) {
- var (
- hashedKey []byte
- ciphertext []byte
- iv []byte
- block cipher.Block
- stream cipher.Stream
- e error
- )
-
- hashedKey = CreateHash(password)
- ciphertext = make([]byte, aes.BlockSize+len(hashedKey)+len(data))
- iv = ciphertext[:aes.BlockSize]
- if _, e = io.ReadFull(rand.Reader, iv); e != nil {
- return []byte{}, e
- }
- block, e = CreateKey(hashedKey)
- if e != nil {
- return []byte{}, e
- }
- stream = cipher.NewCFBEncrypter(block, iv)
- stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(hashedKey))
- stream.XORKeyStream(ciphertext[aes.BlockSize+len([]byte(hashedKey)):], data)
- return ciphertext, nil
- }
-
- func EncryptFile(password string, FilePath string) error {
- var (
- plaintext []byte
- ciphertext []byte
- encryptedFile *os.File
- e error
- )
- plaintext, e = ioutil.ReadFile(FilePath)
- if e != nil {
- return e
- }
- ciphertext, e = EncryptData(password, plaintext)
- if e != nil {
- return e
- }
- // open output file
- encryptedFile, e = os.Create(FilePath + ".enc")
- if e != nil {
- return e
- }
-
- defer func() {
- encryptedFile.Close()
- SecureDelete(FilePath)
- }()
-
- _, e = io.Copy(encryptedFile, bytes.NewReader(ciphertext))
- if e != nil {
- return e
- }
-
- return nil
- }
|