diff options
-rw-r--r-- | challenge/c11.go | 34 | ||||
-rw-r--r-- | lib/oracle.go | 32 | ||||
-rw-r--r-- | lib/rand.go | 2 |
3 files changed, 34 insertions, 34 deletions
diff --git a/challenge/c11.go b/challenge/c11.go index 703b959..211d48c 100644 --- a/challenge/c11.go +++ b/challenge/c11.go @@ -10,11 +10,43 @@ import ( ) func C11() { + // Given an input `in`, this function AES encrypts `in` using a + // randomly generate 16-byte key using ECB or CBC mode and returns the + // cipher. + encrypt := func(in []byte) []byte { + // Generate random key. + key, err := lib.RandomBytes(16) + if err != nil { + panic(err) + } + // Generate random initialization vector; needed for AES CBC. + iv, err := lib.RandomBytes(16) + if err != nil { + panic(err) + } + + // Add 5-10 bytes at the beginning and end of `in` + in = append(lib.RandomBytesWithLengthBetween(5, 10), in...) + in = append(in, lib.RandomBytesWithLengthBetween(5, 10)...) + + // Randomly encrypt `in` with AES in ECB or CBC mode. + m := lib.RandomInt(0, 1) + var out []byte + if m == 0 { + // Encrypt with AES in ECB mode. + out = lib.AESEncryptECB(in, key) + } else { + // Encrypt with AES in CBC mode. + out = lib.AESEncryptCBC(in, key, iv) + } + return out + } + p := lib.StrToBytes("YellowSubmarine YellowSubmarine YellowSubmarine") fmt.Printf("Input: %v (%d)\n", p, len(p)) for i := 0; i < 10; i++ { - o := lib.OracleAESRandomEncrypt(p) + o := encrypt(p) if lib.CipherUsesECB(o) != nil { fmt.Printf("%d -> Enciphered with ECB: %v (%d)\n", i, o, len(o)) } else { diff --git a/lib/oracle.go b/lib/oracle.go index 29338ff..8a449a1 100644 --- a/lib/oracle.go +++ b/lib/oracle.go @@ -25,38 +25,6 @@ func init() { } } -// Given an input `in`, this function AES encrypts `in` using a -// randomly generate 16-byte key using ECB or CBC mode and returns the -// cipher. -func OracleAESRandomEncrypt(in []byte) []byte { - // Generate random key. - key, err := RandomBytes(16) - if err != nil { - panic(err) - } - // Generate random initialization vector; needed for AES CBC. - iv, err := RandomBytes(16) - if err != nil { - panic(err) - } - - // Add 5-10 bytes at the beginning and end of `in` - in = append(randomBytesWithLengthBetween(5, 10), in...) - in = append(in, randomBytesWithLengthBetween(5, 10)...) - - // Randomly encrypt `in` with AES in ECB or CBC mode. - m := RandomInt(0, 1) - var out []byte - if m == 0 { - // Encrypt with AES in ECB mode. - out = AESEncryptECB(in, key) - } else { - // Encrypt with AES in CBC mode. - out = AESEncryptCBC(in, key, iv) - } - return out -} - func OracleAESEncryptECB(in []byte) []byte { return AESEncryptECB(append(in, Base64ToBytes(oracleUnknown)...), oracleKey) } diff --git a/lib/rand.go b/lib/rand.go index 1ba1679..be95366 100644 --- a/lib/rand.go +++ b/lib/rand.go @@ -37,7 +37,7 @@ func RandomBytes(size int) ([]byte, error) { } // Randomly generates `min` to `max` bytes. -func randomBytesWithLengthBetween(min, max int64) []byte { +func RandomBytesWithLengthBetween(min, max int64) []byte { bs := make([]byte, RandomInt(min, max)) _, err := rand.Read(bs) if err != nil { |