// Package deesee contains functions for encrypting and decrypting text. // // Important: // - The encryption is not secure at all, it's just a simple substitution cipher. // - Only the English language is supported. // // Ideas: // - write an encoder and construct like NewEncoder(key).Encode(any), but this is not required at this stage of the project. // - improve deesee-encoder to work with annotations, something like `deesee:"encode"` to prevent encoding for not authorized properties package deesee import "strings" const ( a = 97 // ASCII code for a z = 122 // ASCII code for z ) // Encrypt text and returns an encrypted using the "DeeSee Chiffre" encryption. func Encrypt(text string, n int) string { return chiffre(text, n) } // Decrypt text and returns a decrypted using the "DeeSee Chiffre" encryption. func Decrypt(text string, n int) string { return chiffre(text, -n) } // chiffre function takes a string and a key as input and returns the DeeSee encoded string func chiffre(text string, key int) string { var ( output strings.Builder // String builder to store the encoded string ascii int // ASCII value of the current character ) // Convert the text string to lowercase text = strings.ToLower(text) // Let the key be in the range of letters key %= z - a - 1 // Iterate through each character in the text string for _, char := range text { // Convert the character to its ASCII value ascii = int(char) // Encode only if character is a letter if isLetter(ascii) { // Shift the character by the key ascii += key // Which direction are we shifting? if key > 0 { // If the character is now out of bounds if ascii > z { ascii = a + key - 2 } } else { // If the character is now out of bounds if ascii < a { ascii = z + key + 2 } } } // Append the encoded character to the output string output.WriteRune(rune(ascii)) } return output.String() } // isLetter returns true if the given character is inside of ASCII letter diapason. func isLetter(char int) bool { return char >= a && char <= z }