implemented guess function for caesar cipher

This commit is contained in:
Derek McQuay 2016-03-14 12:50:45 -07:00
parent 757c1483b4
commit 38348f978f
2 changed files with 48 additions and 14 deletions

26
main.go
View File

@ -13,6 +13,21 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
func clean(input string) string {
input = strings.ToUpper(strings.Replace(input, ",", "", -1))
input = strings.ToUpper(strings.Replace(input, ".", "", -1))
input = strings.ToUpper(strings.Replace(input, "'", "", -1))
input = strings.ToUpper(strings.Replace(input, "\"", "", -1))
input = strings.ToUpper(strings.Replace(input, "(", "", -1))
input = strings.ToUpper(strings.Replace(input, ")", "", -1))
input = strings.ToUpper(strings.Replace(input, ";", "", -1))
input = strings.ToUpper(strings.Replace(input, ":", "", -1))
input = strings.ToUpper(strings.Replace(input, "!", "", -1))
input = strings.ToUpper(strings.Replace(input, "?", "", -1))
input = strings.ToUpper(strings.Replace(input, "$", "", -1))
return input
}
func init() { func init() {
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
} }
@ -115,6 +130,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
for _, arg := range args { for _, arg := range args {
arg = clean(arg)
arg = strings.ToUpper(strings.Replace(arg, " ", "", -1)) arg = strings.ToUpper(strings.Replace(arg, " ", "", -1))
key = strings.ToUpper(strings.Replace(key, " ", "", -1)) key = strings.ToUpper(strings.Replace(key, " ", "", -1))
fmt.Printf("%v\n", psyfer.VigenereCipher(arg, key, decrypt)) fmt.Printf("%v\n", psyfer.VigenereCipher(arg, key, decrypt))
@ -124,14 +140,18 @@ func main() {
var guess = &cobra.Command{ var guess = &cobra.Command{
Use: "guess", Use: "guess",
Short: "guess cipher", Short: "guess caesar cipher",
Long: `will try to guess ceasar cipher`, Long: `will try to guess a caesar cipher`,
Run: func(cmd *cobra.Command, args []string) { Run: func(cmd *cobra.Command, args []string) {
if len(args) < 1 { if len(args) < 1 {
fmt.Println("missing input, see -h (--help) for more info") fmt.Println("missing input, see -h (--help) for more info")
os.Exit(1) os.Exit(1)
} }
psyfer.Guess() fmt.Println("Top 5 possibilities:")
for _, arg := range args {
arg = clean(arg)
psyfer.Guess(arg)
}
}, },
} }

View File

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"math" "math"
"sort" "sort"
"strings"
) )
var charFreq = []float64{ var charFreq = []float64{
@ -58,22 +59,35 @@ func (p allPhi) Len() int { return len(p) }
func (p allPhi) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p allPhi) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
func (p allPhi) Less(i, j int) bool { return p[i].value < p[j].value } func (p allPhi) Less(i, j int) bool { return p[i].value < p[j].value }
func Guess() { func CharacterFrequency(input string) map[rune]float64 {
fmt.Println((6 - 7) % 26) cf := make(map[rune]int)
freq := make(map[rune]float64)
for _, c := range input {
cf[c]++
}
l := len(input)
for c, n := range cf {
freq[c] = float64(n) / float64(l)
}
return freq
}
func Guess(input string) {
alphabet := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input = strings.ToUpper(strings.Replace(input, " ", "", -1))
freq := CharacterFrequency(input)
total := []phi{} total := []phi{}
for i := 0; i < 26; i++ { for i := 0; i < 26; i++ {
a := 0.0 a := 0.0
a += 0.1 * charFreq[pc(6, i)] for c, n := range freq {
a += 0.1 * charFreq[pc(7, i)] index := int(c - 'A')
a += 0.1 * charFreq[pc(10, i)] a += n * charFreq[pc(index, i)]
a += 0.3 * charFreq[pc(14, i)] }
a += 0.2 * charFreq[pc(17, i)]
a += 0.1 * charFreq[pc(20, i)]
a += 0.1 * charFreq[pc(25, i)]
p := phi{i, a} p := phi{i, a}
total = append(total, p) total = append(total, p)
} }
fmt.Println(total)
sort.Sort(allPhi(total)) sort.Sort(allPhi(total))
fmt.Println(total) for i := len(total) - 1; i > len(total)-6; i-- {
fmt.Println(VigenereCipher(input, string(alphabet[total[i].position]), true))
}
} }