about summary refs log tree commit diff
path: root/structs
diff options
context:
space:
mode:
Diffstat (limited to 'structs')
-rw-r--r--structs/structs.go105
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
+}