91 lines
2.1 KiB
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
|
|
}
|