diff options
Diffstat (limited to 'structs')
-rw-r--r-- | structs/structs.go | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/structs/structs.go b/structs/structs.go new file mode 100644 index 0000000..9f12b34 --- /dev/null +++ b/structs/structs.go @@ -0,0 +1,105 @@ +package structs + +import ( + "fmt" +) + +type Ciphertext struct { + Text string // the CipherText + FrequencyMap map[string]int // frequency map + BiGrams map[string]int // frequency map + cipher []string // list of ciphers that were applied to get this payload +} + +// RotAll rotates the given ciphertext for all possile rotations +func (CiphertextVar Ciphertext) DecodeRotN(mainChannel chan Ciphertext) { + + // Calculate the new ciphertext for all rotations and push the result into the channel + for i := 0; i < 26; i++ { + CiphertextVar.Rot(i, mainChannel) + } +} + +// Rot rotates a ciphertext n units in one direction +func (CiphertextVar Ciphertext) Rot(n int, mainChannel chan Ciphertext) { + + // Length of the given ciphertext + var CiphertextLength int = len(CiphertextVar.Text) + var RotatedText string + + // Iterate over all the chars in the ciphertext and shift them by i units circular + for i := 0; i < CiphertextLength; i++ { + + // Handle uppercase characters + if 65 < int(CiphertextVar.Text[i]) == true && (int(CiphertextVar.Text[i])) < 90 == true { + var newChar = (((int(CiphertextVar.Text[i]) + n) - 65) % 26) + 65 + RotatedText += string(newChar) + } + + // Handle lowercase characters + if 97 < int(CiphertextVar.Text[i]) == true && (int(CiphertextVar.Text[i])) < 122 == true { + var newChar = (((int(CiphertextVar.Text[i]) + n) - 97) % 26) + 97 + RotatedText += string(newChar) + } + } + + // Convert the RotatedText string into a Ciphertext struct + RotatedCipherStruct := Ciphertext{ + Text: RotatedText, + FrequencyMap: nil, + cipher: nil, + } + + // Push the RotatedCipherStruct back into the main channel + mainChannel <- RotatedCipherStruct +} + +func (PrintString Ciphertext) Println() { + fmt.Println(PrintString) +} + +func (CiphertextVar Ciphertext) GenFrequencyMap(mainChannel chan Ciphertext) { + + // Initialize a Map mapping runes (chars) to ins (the amount of occurrences) + newFrequencyMap := make(map[string]int) + + // Iterate over all the characters in the CipherText generating a FrequencyMap + CipherTextLength := len(CiphertextVar.Text) + ciphertext := CiphertextVar.Text + for i := 0; i < CipherTextLength; i++ { + newFrequencyMap[string(rune(ciphertext[i]))] = newFrequencyMap[string(rune(ciphertext[i]))] + 1 + } + + // Generate an instance of the Ciphertext containing the new FrequencyMap + newCipherText := Ciphertext{ + Text: CiphertextVar.Text, + FrequencyMap: newFrequencyMap, + BiGrams: nil, + cipher: nil, + } + + // Push the newCipherText back into the mainChannel + mainChannel <- newCipherText +} + +func (CiphertextVar Ciphertext) GenBiGramMap(mainChannel chan Ciphertext) { + newBiGramMap := make(map[string]int) + + // Iterate over all the characters in the CipherText generating a FrequencyMap + CipherTextLength := len(CiphertextVar.Text) + ciphertext := CiphertextVar.Text + for i := 0; i < CipherTextLength-1; i++ { + newBiGramMap[string(ciphertext[i:i+2])] = newBiGramMap[string(ciphertext[i:i+2])] + 1 + } + + // Generate an instance of the Ciphertext containing the new FrequencyMap + newCipherText := Ciphertext{ + Text: CiphertextVar.Text, + FrequencyMap: CiphertextVar.FrequencyMap, + BiGrams: newBiGramMap, + cipher: nil, + } + + // Push the newCipherText back into the mainChannel + mainChannel <- newCipherText +} |