You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

71 lines
1.4 KiB

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
}