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