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)