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 }