From 05ec0307384f02cd338c7f7960ffd6ffa38dd545 Mon Sep 17 00:00:00 2001 From: derek mcquay Date: Fri, 11 Mar 2016 23:16:08 -0800 Subject: [PATCH] implmented aes subcommand and functions aes is now done! Uses default key value that is stored in program and handles block sizes that are not 16 hex values wide by adding 0x00 until it is 16 wide --- main.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++++--- psyfer/aes.go | 77 +++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 146 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index ec4a30b..18fa40f 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "math/rand" "os" "time" @@ -15,9 +16,30 @@ func init() { rand.Seed(time.Now().UnixNano()) } +var key128 = psyfer.Block{ + 0x2b, 0x28, 0xab, 0x09, + 0x7e, 0xae, 0xf7, 0xcf, + 0x15, 0xd2, 0x15, 0x4f, + 0x16, 0xa6, 0x88, 0x3c, +} +var key192 = psyfer.Block{ + 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, + 0x01, 0x05, 0x09, 0x0d, 0x11, 0x15, + 0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, + 0x03, 0x07, 0x0b, 0x0f, 0x13, 0x17, +} +var key256 = psyfer.Block{ + 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, 0x18, 0x1c, + 0x01, 0x05, 0x09, 0x0d, 0x11, 0x15, 0x19, 0x1d, + 0x02, 0x06, 0x0a, 0x0e, 0x12, 0x16, 0x1a, 0x1e, + 0x03, 0x07, 0x0b, 0x0f, 0x13, 0x17, 0x1b, 0x1f, +} + func main() { var key string + var keysize int var decrypt bool + var ascii bool var trans = &cobra.Command{ Use: "trans mode", @@ -45,11 +67,40 @@ func main() { } var aes = &cobra.Command{ - Use: "aes mode -c [cipher] -k [key] -i [input]", + Use: "aes", Short: "aes cipher", Long: `perform aes cipher`, Run: func(cmd *cobra.Command, args []string) { - fmt.Println("missing input, see -h (--help) for more info") + if len(args) < 1 { + fmt.Println("missing input, see -h (--help) for more info") + os.Exit(1) + } + for _, arg := range args { + all := psyfer.BlockGen(arg) + if ascii { + switch keysize { + case 128: + fmt.Println(psyfer.ToString(all, 128, key128, decrypt)) + case 192: + fmt.Println(psyfer.ToString(all, 192, key192, decrypt)) + case 256: + fmt.Println(psyfer.ToString(all, 256, key256, decrypt)) + default: + log.Fatal("keysize not valid") + } + } else { + switch keysize { + case 128: + fmt.Println(psyfer.ToHex(all, 128, key128, decrypt)) + case 192: + fmt.Println(psyfer.ToHex(all, 192, key192, decrypt)) + case 256: + fmt.Println(psyfer.ToHex(all, 256, key256, decrypt)) + default: + log.Fatal("keysize not valid") + } + } + } }, } @@ -123,6 +174,7 @@ func main() { }, } + //transpose flags split.Flags().BoolVarP( &decrypt, "decrypt", @@ -137,7 +189,7 @@ func main() { false, "decrypt", ) - + //sub flags sub.Flags().StringVarP( &key, "key", @@ -145,10 +197,31 @@ func main() { "", "file containing key", ) + //aes flags + aes.Flags().IntVarP( + &keysize, + "keysize", + "k", + 0, + "keysize", + ) + aes.Flags().BoolVarP( + &ascii, + "ascii", + "a", + false, + "display in ascii (may mess up terminal :) )", + ) + aes.Flags().BoolVarP( + &decrypt, + "decrypt", + "d", + false, + "decrypt", + ) var rootCmd = &cobra.Command{Use: "app"} rootCmd.AddCommand(sub, aes, trans, vig) - aes.AddCommand(crack) trans.AddCommand(random, railfence, split) vig.AddCommand(crack) rootCmd.Execute() diff --git a/psyfer/aes.go b/psyfer/aes.go index 10641b9..b70fba8 100644 --- a/psyfer/aes.go +++ b/psyfer/aes.go @@ -1,5 +1,12 @@ package psyfer +import ( + "encoding/hex" + "fmt" + "log" + "strconv" +) + var Sbox = [][]byte{ {0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76}, {0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0}, @@ -73,7 +80,63 @@ type Block []byte var keyexpanded []Block var key Block +func ToString(all []Block, keysize int, k Block, decrypt bool) string { + final := "" + for _, bl := range all { + result := Block{} + if decrypt { + result = InvCipher(bl, keysize, k) + } else { + result = Cipher(bl, keysize, k) + } + final += string(result) + } + return final +} + +func ToHex(all []Block, keysize int, k Block, decrypt bool) string { + final := "" + for _, bl := range all { + result := Block{} + if decrypt { + result = InvCipher(bl, keysize, k) + } else { + result = Cipher(bl, keysize, k) + } + for i := 0; i < 16; i++ { + final += fmt.Sprintf("0x%x ", result[i]) + } + } + return final +} + +func BlockGen(arg string) []Block { + all := []Block{} + b := Block{} + for i, char := range arg { + value, err := strconv.Atoi(hex.EncodeToString([]byte(string(char)))) + if err != nil { + log.Fatal(err) + } + if i%16 == 0 && i > 0 { + all = append(all, b) + b = b[:0] + } + b = append(b, byte(value)) + if i == len(arg)-1 { + all = append(all, b) + } + } + return all +} + func Cipher(cur Block, bit int, incomingKey Block) Block { + if len(cur) != 16 { + missing := 16 - len(cur) + for i := 0; i < missing; i++ { + cur = append(cur, 0x00) + } + } key = Block{} keyexpanded = []Block{} AssignKey(incomingKey) @@ -85,14 +148,6 @@ func Cipher(cur Block, bit int, incomingKey Block) Block { cur = ShiftRows(cur) cur = MixColumns(cur) cur = AddRoundKey(cur, i+1) - //fmt.Printf("\n") - //for i := 0; i < 16; i++ { - // fmt.Printf("% x", cur[i]) - // if i%4 == 3 { - // fmt.Printf("\n") - // } - //} - } cur = SubBytes(cur) cur = ShiftRows(cur) @@ -135,6 +190,12 @@ func Cipher(cur Block, bit int, incomingKey Block) Block { } func InvCipher(cur Block, bit int, incomingKey Block) Block { + if len(cur) != 16 { + missing := 16 - len(cur) + for i := 0; i < missing; i++ { + cur = append(cur, 0x00) + } + } key = Block{} keyexpanded = []Block{} AssignKey(incomingKey)