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
|
|
}
|