go_encryptedstring/defaultDataCryptor.go

91 lines
2.1 KiB
Go

package encryptedstring
import (
"crypto/rand"
"os"
"path"
)
const (
// EncryptionKeyFileName is the name of the file for storage of the en-/decryption key
EncryptionKeyFileName = ".esk"
)
type defaultDataCryptor struct {
encryptionKey []byte
}
func (ddc *defaultDataCryptor) keyByte(index int) byte {
index = index % len(ddc.encryptionKey)
return ddc.encryptionKey[index]
}
func (ddc *defaultDataCryptor) xorCrypt(in []byte) (out []byte) {
out = make([]byte, 0)
for i := 0; i < len(in); i++ {
out = append(out, in[i]^ddc.keyByte(i))
}
return out
}
// Encrypt tries to encrypt the given binary with the appropriate cipher.
func (ddc *defaultDataCryptor) Encrypt(binary []byte) (encrypted []byte, err error) {
return ddc.xorCrypt(binary), nil
}
// Decrypt tries to decrypt the given binary with the appropriate cipher.
func (ddc *defaultDataCryptor) Decrypt(binary []byte) (decrypted []byte, err error) {
return ddc.xorCrypt(binary), nil
}
func (ddc *defaultDataCryptor) init() (err error) {
// Get the startup directory path
dir := getLocalPath()
if _, err := os.Stat(dir); err != nil {
os.MkdirAll(dir, os.ModePerm)
}
// Check for the key-file
keyFilePath := path.Join(dir, EncryptionKeyFileName)
_, err = os.Stat(keyFilePath)
if err == nil {
// Read the file
if ddc.encryptionKey, err = os.ReadFile(keyFilePath); err == nil {
// We got the key!
return
}
}
// Create a new key-file
ddc.encryptionKey = make([]byte, 1024)
_, err = rand.Read(ddc.encryptionKey)
if err != nil {
return
}
var keyFile *os.File
if keyFile, err = os.Create(keyFilePath); err == nil {
_, err = keyFile.Write(ddc.encryptionKey)
if err == nil {
err = keyFile.Sync()
}
keyFile.Close()
}
if err == nil {
err = setHidden(keyFilePath)
}
return
}
// NewDefaultDataCryptor creates a new XOR-based
// IDataCryptor-interface the key of which is situated
// in a file called '.esk' in the startup directory of
// the application.
func NewDefaultDataCryptor() IDataCryptor {
ddc := &defaultDataCryptor{}
if err := ddc.init(); err != nil {
panic(err)
}
return ddc
}