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.
 
 

101 lines
2.0 KiB

package Encryption
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"errors"
"io"
"io/ioutil"
"os"
)
func DecryptData(password string, ciphertext []byte) ([]byte, error) {
var (
hashedKey []byte
iv []byte
encKey []byte
block cipher.Block
stream cipher.Stream
e error
)
hashedKey = CreateHash(password)
if len(ciphertext) == 0 {
return []byte{}, errors.New("Invalid length")
}
iv = ciphertext[:aes.BlockSize]
encKey = ciphertext[:32+aes.BlockSize][aes.BlockSize:]
ciphertext = ciphertext[aes.BlockSize+32:]
block, e = CreateKey(hashedKey)
if e != nil {
return []byte{}, e
}
stream = cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(encKey, encKey)
for i := range encKey {
if encKey[i] != hashedKey[i] {
return []byte{}, errors.New("Incorrect Password")
}
}
stream.XORKeyStream(ciphertext, ciphertext)
return ciphertext, nil
}
func DecryptFile(password string, FilePath string) error {
var (
OldFilePath string
ciphertext []byte
plaintext []byte
plaintextFile *os.File
e error
)
OldFilePath = FilePath[:(len(FilePath) - 4)]
ciphertext, e = ioutil.ReadFile(FilePath)
if e != nil {
return e
}
if len(ciphertext) < aes.BlockSize {
return errors.New("ciphertext too short")
}
plaintext, e = DecryptData(password, ciphertext)
if e != nil {
return e
}
plaintextFile, e = os.Create(OldFilePath)
if e != nil {
return e
}
_, e = io.Copy(plaintextFile, bytes.NewReader(plaintext))
if e != nil {
return e
}
os.Remove(FilePath)
return nil
}
func DecryptAndReadFile(password string, FilePath string) (string, error) {
var (
ciphertext []byte
plaintext []byte
e error
)
ciphertext, e = ioutil.ReadFile(FilePath)
if e != nil {
return "", e
}
if len(ciphertext) < aes.BlockSize {
return "", errors.New("ciphertext too short")
}
plaintext, e = DecryptData(password, ciphertext)
if e != nil {
return "", e
}
return string(plaintext), nil
}