From 79072f30c96fe6044b20b5b637712ff6cf083f7f Mon Sep 17 00:00:00 2001 From: Abel Stuker Date: Mon, 25 Nov 2024 22:30:42 +0100 Subject: [PATCH] feat: add lamports-paradox challenge --- lamports-paradox/README.md | 15 + lamports-paradox/SOLUTION.md | 15 + lamports-paradox/aes.c | 572 ++++++++++++++++++++++++++++++++++ lamports-paradox/aes.h | 91 ++++++ lamports-paradox/secret | Bin 0 -> 21160 bytes lamports-paradox/secret.c | 81 +++++ lamports-paradox/solution.png | Bin 0 -> 42332 bytes 7 files changed, 774 insertions(+) create mode 100644 lamports-paradox/README.md create mode 100644 lamports-paradox/SOLUTION.md create mode 100644 lamports-paradox/aes.c create mode 100644 lamports-paradox/aes.h create mode 100755 lamports-paradox/secret create mode 100644 lamports-paradox/secret.c create mode 100644 lamports-paradox/solution.png diff --git a/lamports-paradox/README.md b/lamports-paradox/README.md new file mode 100644 index 0000000..06a4ea8 --- /dev/null +++ b/lamports-paradox/README.md @@ -0,0 +1,15 @@ +# Lamport's Paradox + +## Text + +In a world where causality is king and conflicts are inevitable, a mysterious piece of software claims to reconcile all differences... but something doesn’t add up. Dr. Cora Delaney-Turing (CRDT for short), a renowned post-doc in distributed systems, has left behind a cryptic program for her peers to reverse engineer. The software operates on an unknown causal model and uses cutting-edge conflict-resolution techniques. However, there’s a catch—hidden within its elegant logic is a key, a secret Dr. Delaney-Turing never intended anyone to find. + +Your mission: uncover the hidden message buried in the code and unravel the mystery behind Dr. Delaney-Turing’s ultimate creation. Can you restore order from the chaos, or will you be consumed by the conflicts within? + +## Files + +secret (binary, not source) + +## How to Deploy + +n/a diff --git a/lamports-paradox/SOLUTION.md b/lamports-paradox/SOLUTION.md new file mode 100644 index 0000000..27f0000 --- /dev/null +++ b/lamports-paradox/SOLUTION.md @@ -0,0 +1,15 @@ +## Difficulty + +20/100 | EASY + +## Category + +SOFT Challenge + +## How To Solve + +Reverse engineer the binary to find the serial key: 137-COOKIE. (as shown in screenshot) + +## Flag + +IGCTF{it's always 42} diff --git a/lamports-paradox/aes.c b/lamports-paradox/aes.c new file mode 100644 index 0000000..4481f7b --- /dev/null +++ b/lamports-paradox/aes.c @@ -0,0 +1,572 @@ +/* + +This is an implementation of the AES algorithm, specifically ECB, CTR and CBC mode. +Block size can be chosen in aes.h - available choices are AES128, AES192, AES256. + +The implementation is verified against the test vectors in: + National Institute of Standards and Technology Special Publication 800-38A 2001 ED + +ECB-AES128 +---------- + + plain-text: + 6bc1bee22e409f96e93d7e117393172a + ae2d8a571e03ac9c9eb76fac45af8e51 + 30c81c46a35ce411e5fbc1191a0a52ef + f69f2445df4f9b17ad2b417be66c3710 + + key: + 2b7e151628aed2a6abf7158809cf4f3c + + resulting cipher + 3ad77bb40d7a3660a89ecaf32466ef97 + f5d3d58503b9699de785895a96fdbaaf + 43b1cd7f598ece23881b00e3ed030688 + 7b0c785e27e8ad3f8223207104725dd4 + + +NOTE: String length must be evenly divisible by 16byte (str_len % 16 == 0) + You should pad the end of the string with zeros if this is not the case. + For AES192/256 the key size is proportionally larger. + +*/ + + +/*****************************************************************************/ +/* Includes: */ +/*****************************************************************************/ +#include // CBC mode, for memset +#include "aes.h" + +/*****************************************************************************/ +/* Defines: */ +/*****************************************************************************/ +// The number of columns comprising a state in AES. This is a constant in AES. Value=4 +#define Nb 4 + +#if defined(AES256) && (AES256 == 1) + #define Nk 8 + #define Nr 14 +#elif defined(AES192) && (AES192 == 1) + #define Nk 6 + #define Nr 12 +#else + #define Nk 4 // The number of 32 bit words in a key. + #define Nr 10 // The number of rounds in AES Cipher. +#endif + +// jcallan@github points out that declaring Multiply as a function +// reduces code size considerably with the Keil ARM compiler. +// See this link for more information: https://github.com/kokke/tiny-AES-C/pull/3 +#ifndef MULTIPLY_AS_A_FUNCTION + #define MULTIPLY_AS_A_FUNCTION 0 +#endif + + + + +/*****************************************************************************/ +/* Private variables: */ +/*****************************************************************************/ +// state - array holding the intermediate results during decryption. +typedef uint8_t state_t[4][4]; + + + +// The lookup-tables are marked const so they can be placed in read-only storage instead of RAM +// The numbers below can be computed dynamically trading ROM for RAM - +// This can be useful in (embedded) bootloader applications, where ROM is often limited. +static const uint8_t sbox[256] = { + //0 1 2 3 4 5 6 7 8 9 A B C D E F + 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, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static const uint8_t rsbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; +#endif + +// The round constant word array, Rcon[i], contains the values given by +// x to the power (i-1) being powers of x (x is denoted as {02}) in the field GF(2^8) +static const uint8_t Rcon[11] = { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 }; + +/* + * Jordan Goulder points out in PR #12 (https://github.com/kokke/tiny-AES-C/pull/12), + * that you can remove most of the elements in the Rcon array, because they are unused. + * + * From Wikipedia's article on the Rijndael key schedule @ https://en.wikipedia.org/wiki/Rijndael_key_schedule#Rcon + * + * "Only the first some of these constants are actually used – up to rcon[10] for AES-128 (as 11 round keys are needed), + * up to rcon[8] for AES-192, up to rcon[7] for AES-256. rcon[0] is not used in AES algorithm." + */ + + +/*****************************************************************************/ +/* Private functions: */ +/*****************************************************************************/ +/* +static uint8_t getSBoxValue(uint8_t num) +{ + return sbox[num]; +} +*/ +#define getSBoxValue(num) (sbox[(num)]) + +// This function produces Nb(Nr+1) round keys. The round keys are used in each round to decrypt the states. +static void KeyExpansion(uint8_t* RoundKey, const uint8_t* Key) +{ + unsigned i, j, k; + uint8_t tempa[4]; // Used for the column/row operations + + // The first round key is the key itself. + for (i = 0; i < Nk; ++i) + { + RoundKey[(i * 4) + 0] = Key[(i * 4) + 0]; + RoundKey[(i * 4) + 1] = Key[(i * 4) + 1]; + RoundKey[(i * 4) + 2] = Key[(i * 4) + 2]; + RoundKey[(i * 4) + 3] = Key[(i * 4) + 3]; + } + + // All other round keys are found from the previous round keys. + for (i = Nk; i < Nb * (Nr + 1); ++i) + { + { + k = (i - 1) * 4; + tempa[0]=RoundKey[k + 0]; + tempa[1]=RoundKey[k + 1]; + tempa[2]=RoundKey[k + 2]; + tempa[3]=RoundKey[k + 3]; + + } + + if (i % Nk == 0) + { + // This function shifts the 4 bytes in a word to the left once. + // [a0,a1,a2,a3] becomes [a1,a2,a3,a0] + + // Function RotWord() + { + const uint8_t u8tmp = tempa[0]; + tempa[0] = tempa[1]; + tempa[1] = tempa[2]; + tempa[2] = tempa[3]; + tempa[3] = u8tmp; + } + + // SubWord() is a function that takes a four-byte input word and + // applies the S-box to each of the four bytes to produce an output word. + + // Function Subword() + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + + tempa[0] = tempa[0] ^ Rcon[i/Nk]; + } +#if defined(AES256) && (AES256 == 1) + if (i % Nk == 4) + { + // Function Subword() + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + } +#endif + j = i * 4; k=(i - Nk) * 4; + RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0]; + RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1]; + RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2]; + RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3]; + } +} + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key) +{ + KeyExpansion(ctx->RoundKey, key); +} +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv) +{ + KeyExpansion(ctx->RoundKey, key); + memcpy (ctx->Iv, iv, AES_BLOCKLEN); +} +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv) +{ + memcpy (ctx->Iv, iv, AES_BLOCKLEN); +} +#endif + +// This function adds the round key to state. +// The round key is added to the state by an XOR function. +static void AddRoundKey(uint8_t round, state_t* state, const uint8_t* RoundKey) +{ + uint8_t i,j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j]; + } + } +} + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +static void SubBytes(state_t* state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[j][i] = getSBoxValue((*state)[j][i]); + } + } +} + +// The ShiftRows() function shifts the rows in the state to the left. +// Each row is shifted with different offset. +// Offset = Row number. So the first row is not shifted. +static void ShiftRows(state_t* state) +{ + uint8_t temp; + + // Rotate first row 1 columns to left + temp = (*state)[0][1]; + (*state)[0][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[3][1]; + (*state)[3][1] = temp; + + // Rotate second row 2 columns to left + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + // Rotate third row 3 columns to left + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[3][3]; + (*state)[3][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[1][3]; + (*state)[1][3] = temp; +} + +static uint8_t xtime(uint8_t x) +{ + return ((x<<1) ^ (((x>>7) & 1) * 0x1b)); +} + +// MixColumns function mixes the columns of the state matrix +static void MixColumns(state_t* state) +{ + uint8_t i; + uint8_t Tmp, Tm, t; + for (i = 0; i < 4; ++i) + { + t = (*state)[i][0]; + Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3] ; + Tm = (*state)[i][0] ^ (*state)[i][1] ; Tm = xtime(Tm); (*state)[i][0] ^= Tm ^ Tmp ; + Tm = (*state)[i][1] ^ (*state)[i][2] ; Tm = xtime(Tm); (*state)[i][1] ^= Tm ^ Tmp ; + Tm = (*state)[i][2] ^ (*state)[i][3] ; Tm = xtime(Tm); (*state)[i][2] ^= Tm ^ Tmp ; + Tm = (*state)[i][3] ^ t ; Tm = xtime(Tm); (*state)[i][3] ^= Tm ^ Tmp ; + } +} + +// Multiply is used to multiply numbers in the field GF(2^8) +// Note: The last call to xtime() is unneeded, but often ends up generating a smaller binary +// The compiler seems to be able to vectorize the operation better this way. +// See https://github.com/kokke/tiny-AES-c/pull/34 +#if MULTIPLY_AS_A_FUNCTION +static uint8_t Multiply(uint8_t x, uint8_t y) +{ + return (((y & 1) * x) ^ + ((y>>1 & 1) * xtime(x)) ^ + ((y>>2 & 1) * xtime(xtime(x))) ^ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))); /* this last call to xtime() can be omitted */ + } +#else +#define Multiply(x, y) \ + ( ((y & 1) * x) ^ \ + ((y>>1 & 1) * xtime(x)) ^ \ + ((y>>2 & 1) * xtime(xtime(x))) ^ \ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ \ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) \ + +#endif + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +/* +static uint8_t getSBoxInvert(uint8_t num) +{ + return rsbox[num]; +} +*/ +#define getSBoxInvert(num) (rsbox[(num)]) + +// MixColumns function mixes the columns of the state matrix. +// The method used to multiply may be difficult to understand for the inexperienced. +// Please use the references to gain more information. +static void InvMixColumns(state_t* state) +{ + int i; + uint8_t a, b, c, d; + for (i = 0; i < 4; ++i) + { + a = (*state)[i][0]; + b = (*state)[i][1]; + c = (*state)[i][2]; + d = (*state)[i][3]; + + (*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09); + (*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d); + (*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b); + (*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e); + } +} + + +// The SubBytes Function Substitutes the values in the +// state matrix with values in an S-box. +static void InvSubBytes(state_t* state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) + { + for (j = 0; j < 4; ++j) + { + (*state)[j][i] = getSBoxInvert((*state)[j][i]); + } + } +} + +static void InvShiftRows(state_t* state) +{ + uint8_t temp; + + // Rotate first row 1 columns to right + temp = (*state)[3][1]; + (*state)[3][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[0][1]; + (*state)[0][1] = temp; + + // Rotate second row 2 columns to right + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + // Rotate third row 3 columns to right + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[1][3]; + (*state)[1][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[3][3]; + (*state)[3][3] = temp; +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +// Cipher is the main function that encrypts the PlainText. +static void Cipher(state_t* state, const uint8_t* RoundKey) +{ + uint8_t round = 0; + + // Add the First round key to the state before starting the rounds. + AddRoundKey(0, state, RoundKey); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr rounds are executed in the loop below. + // Last one without MixColumns() + for (round = 1; ; ++round) + { + SubBytes(state); + ShiftRows(state); + if (round == Nr) { + break; + } + MixColumns(state); + AddRoundKey(round, state, RoundKey); + } + // Add round key to last round + AddRoundKey(Nr, state, RoundKey); +} + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static void InvCipher(state_t* state, const uint8_t* RoundKey) +{ + uint8_t round = 0; + + // Add the First round key to the state before starting the rounds. + AddRoundKey(Nr, state, RoundKey); + + // There will be Nr rounds. + // The first Nr-1 rounds are identical. + // These Nr rounds are executed in the loop below. + // Last one without InvMixColumn() + for (round = (Nr - 1); ; --round) + { + InvShiftRows(state); + InvSubBytes(state); + AddRoundKey(round, state, RoundKey); + if (round == 0) { + break; + } + InvMixColumns(state); + } + +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +/*****************************************************************************/ +/* Public functions: */ +/*****************************************************************************/ +#if defined(ECB) && (ECB == 1) + + +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf) +{ + // The next function call encrypts the PlainText with the Key using AES algorithm. + Cipher((state_t*)buf, ctx->RoundKey); +} + +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf) +{ + // The next function call decrypts the PlainText with the Key using AES algorithm. + InvCipher((state_t*)buf, ctx->RoundKey); +} + + +#endif // #if defined(ECB) && (ECB == 1) + + + + + +#if defined(CBC) && (CBC == 1) + + +static void XorWithIv(uint8_t* buf, const uint8_t* Iv) +{ + uint8_t i; + for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size + { + buf[i] ^= Iv[i]; + } +} + +void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t* buf, size_t length) +{ + size_t i; + uint8_t *Iv = ctx->Iv; + for (i = 0; i < length; i += AES_BLOCKLEN) + { + XorWithIv(buf, Iv); + Cipher((state_t*)buf, ctx->RoundKey); + Iv = buf; + buf += AES_BLOCKLEN; + } + /* store Iv in ctx for next call */ + memcpy(ctx->Iv, Iv, AES_BLOCKLEN); +} + +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length) +{ + size_t i; + uint8_t storeNextIv[AES_BLOCKLEN]; + for (i = 0; i < length; i += AES_BLOCKLEN) + { + memcpy(storeNextIv, buf, AES_BLOCKLEN); + InvCipher((state_t*)buf, ctx->RoundKey); + XorWithIv(buf, ctx->Iv); + memcpy(ctx->Iv, storeNextIv, AES_BLOCKLEN); + buf += AES_BLOCKLEN; + } + +} + +#endif // #if defined(CBC) && (CBC == 1) + + + +#if defined(CTR) && (CTR == 1) + +/* Symmetrical operation: same function for encrypting as for decrypting. Note any IV/nonce should never be reused with the same key */ +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length) +{ + uint8_t buffer[AES_BLOCKLEN]; + + size_t i; + int bi; + for (i = 0, bi = AES_BLOCKLEN; i < length; ++i, ++bi) + { + if (bi == AES_BLOCKLEN) /* we need to regen xor compliment in buffer */ + { + + memcpy(buffer, ctx->Iv, AES_BLOCKLEN); + Cipher((state_t*)buffer,ctx->RoundKey); + + /* Increment Iv and handle overflow */ + for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi) + { + /* inc will overflow */ + if (ctx->Iv[bi] == 255) + { + ctx->Iv[bi] = 0; + continue; + } + ctx->Iv[bi] += 1; + break; + } + bi = 0; + } + + buf[i] = (buf[i] ^ buffer[bi]); + } +} + +#endif // #if defined(CTR) && (CTR == 1) + diff --git a/lamports-paradox/aes.h b/lamports-paradox/aes.h new file mode 100644 index 0000000..b29b668 --- /dev/null +++ b/lamports-paradox/aes.h @@ -0,0 +1,91 @@ +#ifndef _AES_H_ +#define _AES_H_ + +#include +#include + +// #define the macros below to 1/0 to enable/disable the mode of operation. +// +// CBC enables AES encryption in CBC-mode of operation. +// CTR enables encryption in counter-mode. +// ECB enables the basic ECB 16-byte block algorithm. All can be enabled simultaneously. + +// The #ifndef-guard allows it to be configured before #include'ing or at compile time. +#ifndef CBC + #define CBC 1 +#endif + +#ifndef ECB + #define ECB 1 +#endif + +#ifndef CTR + #define CTR 1 +#endif + + +#define AES128 1 +//#define AES192 1 +//#define AES256 1 + +#define AES_BLOCKLEN 16 // Block length in bytes - AES is 128b block only + +#if defined(AES256) && (AES256 == 1) + #define AES_KEYLEN 32 + #define AES_keyExpSize 240 +#elif defined(AES192) && (AES192 == 1) + #define AES_KEYLEN 24 + #define AES_keyExpSize 208 +#else + #define AES_KEYLEN 16 // Key length in bytes + #define AES_keyExpSize 176 +#endif + +struct AES_ctx +{ + uint8_t RoundKey[AES_keyExpSize]; +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) + uint8_t Iv[AES_BLOCKLEN]; +#endif +}; + +void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key); +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv); +void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv); +#endif + +#if defined(ECB) && (ECB == 1) +// buffer size is exactly AES_BLOCKLEN bytes; +// you need only AES_init_ctx as IV is not used in ECB +// NB: ECB is considered insecure for most uses +void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf); +void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf); + +#endif // #if defined(ECB) && (ECB == !) + + +#if defined(CBC) && (CBC == 1) +// buffer size MUST be mutile of AES_BLOCKLEN; +// Suggest https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme +// NOTES: you need to set IV in ctx via AES_init_ctx_iv() or AES_ctx_set_iv() +// no IV should ever be reused with the same key +void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); +void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); + +#endif // #if defined(CBC) && (CBC == 1) + + +#if defined(CTR) && (CTR == 1) + +// Same function for encrypting as for decrypting. +// IV is incremented for every block, and used after encryption as XOR-compliment for output +// Suggesting https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS7 for padding scheme +// NOTES: you need to set IV in ctx with AES_init_ctx_iv() or AES_ctx_set_iv() +// no IV should ever be reused with the same key +void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length); + +#endif // #if defined(CTR) && (CTR == 1) + + +#endif // _AES_H_ diff --git a/lamports-paradox/secret b/lamports-paradox/secret new file mode 100755 index 0000000000000000000000000000000000000000..de35dc3f9fcdff9417c57ad29e4d2d24e9e9f9bd GIT binary patch literal 21160 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 +#include +#include + +#define ECB 1 + +#include "aes.h" + + +int isPrime(unsigned int number) { + if (number <= 1) return 0; + unsigned int i; + + for (i=2; i*i<=number; i++) { + if (number % i == 0) return 0; + } + + return 1; +} + + +int getPrimeIndex(int n) { + int primeCounter = 0; + if (isPrime(n)) { + for (int i=1; i<=n; i++) { + primeCounter += isPrime(i); + } + return primeCounter; + } else { + return 0; + } +} + +int main(void) +{ + int number; + char str[7]; + + char key1[7]; + char key2[7] = "r|xzzr"; + char key3[17]; + char enc[17] = "\xce\xe7\xcd\x07\x9a\xf8\x40\x2f\xb1\xe0\xeb\xe0\x3c\x5b\x77\xbc"; + + printf("Enter key: "); + + scanf("%d-%6s", &number, &str); + + int ind; + if ((ind = getPrimeIndex(number)) != 33) { + printf("Bad key\r\n"); + return -1; + } + + sprintf(key1, "%d%d", number, number); + + //printf("key1: %s\r\n", key1); + + for (int i=0; i<6; i++) { + key2[i] ^= key1[i]; + } + + // printf("key2: %s\r\n", key2); + + if (strcmp(key2, str) == 0) { + printf("Decoding...\r\n"); + sprintf(key3, "%s-%s-OK", key1, key2); + //printf("key3: %s\r\n", key3); + + struct AES_ctx ctx; + + AES_init_ctx(&ctx, key3); + AES_ECB_decrypt(&ctx, enc); + printf("Decoded: IGCTF{%s}\r\n", enc); + + } else { + printf("Bad key\r\n"); + return -2; + } + + return 0; +} diff --git a/lamports-paradox/solution.png b/lamports-paradox/solution.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b53047465719f60ffb3ce6e31cfd1b68873bfc GIT binary patch literal 42332 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