Batuik • バツイク

Batuik • バツイク's avatar
Batuik • バツイク
npub132uu...laed
Software engineer with 5 years of .NET expertise incl. Blazor WASM, and 3 years of React/Angular/Svelte/Vue. #GameStop to the moon!
Its not that I hadn't realized 🥭-man is an asshat. I just never expected the man to actually be retarded. News out if USA are just getting stranger and stranger by the day, and honestly, 3 more years of this shit will be very tough to go through. Let's just hope we're all even alive after 3 more years, with this guy fully willing to gamble world peace away, accompanied by lies and deceptuin, just to seem like he's a tough guy. You're a tough guy alright, don't have to prove it by destroying the world.
```csharp // --------------------------------------------------------------- // Fast AES‑128 (single‑block) – stackalloc + unsafe // --------------------------------------------------------------- using System; using System.Runtime.CompilerServices; namespace FastAes { public static unsafe class Aes128Fast { // ----------------------------------------------------------------- // 1. Tables (S‑box and MixColumns multiplication tables) // ----------------------------------------------------------------- private static readonly byte[] sbox = new byte[256] { 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 }; // Multiplication by 2 and 3 in GF(2^8) – used by MixColumns. // Pre‑computing avoids the branch in the classic xtime(). private static readonly byte[] mul2 = new byte[256]; private static readonly byte[] mul3 = new byte[256]; // Round constants (Rcon) – only the first 10 are needed for AES‑128. private static readonly uint[] rcon = new uint[11] { 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 }; // ----------------------------------------------------------------- // 2. Static constructor – fill the multiplication tables once // ----------------------------------------------------------------- static Aes128Fast() { for (int i = 0; i < 256; i++) { int x = i << 1; if ((x & 0x100) != 0) x ^= 0x11B; // reduce modulo the AES polynomial mul2[i] = (byte)(x & 0xFF); mul3[i] = (byte)(mul2[i] ^ i); } } // ----------------------------------------------------------------- // 3. Public entry point – encrypt a single 16‑byte block // ----------------------------------------------------------------- /// <summary> /// Encrypts exactly one 16‑byte block. Caller must ensure /// input, output and key are all 16 bytes long. /// </summary> public static void EncryptBlock( byte* input, // pointer to 16‑byte plaintext byte* output, // pointer to 16‑byte ciphertext buffer byte* key) // pointer to 16‑byte key { // ------------------------------------------------------------- // 3.1 Expand the key (produces 11 round keys = 44 uints) // ------------------------------------------------------------- uint* roundKeys = stackalloc uint[44]; // 44 * 4 = 176 bytes on the stack KeyExpansion(key, roundKeys); // ------------------------------------------------------------- // 3.2 Load the state matrix (column‑major) into four uints // ------------------------------------------------------------- uint* state = stackalloc uint[4]; for (int c = 0; c < 4; c++) state[c] = *(uint*)(input + 4 * c); // little‑endian load matches BitConverter // ------------------------------------------------------------- // 3.3 Initial AddRoundKey (round 0) // ------------------------------------------------------------- for (int c = 0; c < 4; c++) state[c] ^= roundKeys[c]; // ------------------------------------------------------------- // 3.4 Main rounds 1 … 9 (full round) // ------------------------------------------------------------- for (int round = 1; round < 10; round++) { SubBytes(state); ShiftRows(state); MixColumns(state); for (int c = 0; c < 4; c++) state[c] ^= roundKeys[round * 4 + c]; } // ------------------------------------------------------------- // 3.5 Final round (no MixColumns) // ------------------------------------------------------------- SubBytes(state); ShiftRows(state); for (int c = 0; c < 4; c++) state[c] ^= roundKeys[40 + c]; // round 10 // ------------------------------------------------------------- // 3.6 Store ciphertext back to the output buffer // ------------------------------------------------------------- for (int c = 0; c < 4; c++) *(uint*)(output + 4 * c) = state[c]; } // ----------------------------------------------------------------- // 4. Key schedule (expands 16‑byte key to 44 uints) // ----------------------------------------------------------------- private static void KeyExpansion(byte* keyPtr, uint* w) { // Copy the original key (big‑endian per AES spec) for (int i = 0; i < 4; i++) w[i] = ((uint)keyPtr[4 * i] << 24) | ((uint)keyPtr[4 * i + 1] << 16) | ((uint)keyPtr[4 * i + 2] << 8) | ((uint)keyPtr[4 * i + 3]); for (int i = 4; i < 44; i++) { uint temp = w[i - 1]; if ((i & 3) == 0) // i % 4 == 0 { // RotWord temp = (temp << 8) | (temp >> 24); // SubWord temp = (uint)( sbox[(temp >> 24) & 0xFF] << 24 | sbox[(temp >> 16) & 0xFF] << 16 | sbox[(temp >> 8 ) & 0xFF] << 8 | sbox[(temp ) & 0xFF]); // Rcon temp ^= rcon[i / 4]; } w[i] = w[i - 4] ^ temp; } } // ----------------------------------------------------------------- // 5. Core AES transformations (operating on the 4‑column state) // ----------------------------------------------------------------- [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void SubBytes(uint* state) { for (int i = 0; i < 4; i++) { uint v = state[i]; state[i] = (uint)sbox[(v >> 24) & 0xFF] << 24 | (uint)sbox[(v >> 16) & 0xFF] << 16 | (uint)sbox[(v >> 8 ) & 0xFF] << 8 | (uint)sbox[(v ) & 0xFF]; } } // ShiftRows works on the logical 4×4 byte matrix. // Because our state is column‑major, we can implement it by // rotating the bytes inside each column appropriately. [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void ShiftRows(uint* state) { // Extract the four rows into separate byte variables. // We'll rebuild the columns after the rotations. byte b00 = (byte)(state[0] >> 24); byte b01 = (byte)(state[1] >> 24); byte b02 = (byte)(state[2] >> 24); byte b03 = (byte)(state[3] >> 24); byte b10 = (byte)(state[0] >> 16); byte b11 = (byte)(state[1] >> 16); byte b12 = (byte)(state[2] >> 16); byte b13 = (byte)(state[3] >> 16); byte b20 = (byte)(state[0] >> 8); byte b21 = (byte)(state[1] >> 8); byte b22 = (byte)(state[2] >> 8); byte b23 = (byte)(state[3] >> 8); byte b30 = (byte)(state[0]); byte b31 = (byte)(state[1]); byte b32 = (byte)(state[2]); byte b33 = (byte)(state[3]); // Row 0 stays unchanged. // Row 1 rotates left by 1. byte t10 = b11, t11 = b12, t12 = b13, t13 = b10; // Row 2 rotates left by 2. byte t20 = b22, t21 = b23, t22 = b20, t23 = b21; // Row 3 rotates left by 3 (or right by 1). byte t30 = b33, t31 = b30, t32 = b31, t33 = b32; // Re‑pack columns. state[0] = (uint)(b00 << 24 | t10 << 16 | t20 << 8 | t30); state[1] = (uint)(b01 << 24 | t11 << 16 | t21 << 8 | t31); state[2] = (uint)(b02 << 24 | t12 << 16 | t22 << 8 | t32); state[3] = (uint)(b03 << 24 | t13 << 16 | t23 << 8 | t33); } // MixColumns uses the pre‑computed mul2/mul3 tables. [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void MixColumns(uint* state) { for (int c = 0; c < 4; c++) { uint col = state[c]; byte a0 = (byte)(col >> 24); byte a1 = (byte)(col >> 16); byte a2 = (byte)(col >> 8); byte a3 = (byte)(col); // The AES mix‑column matrix: // [02 03 01 01] // [01 02 03 01] // [01 01 02 03] // [03 01 01 02] byte r0 = (byte)(mul2[a0] ^ mul3[a1] ^ a2 ^ a3); byte r1 = (byte)(a0 ^ mul2[a1] ^ mul3[a2] ^ a3); byte r2 = (byte)(a0 ^ a1 ^ mul2[a2] ^ mul3[a3]); byte r3 = (byte)(mul3[a0] ^ a1 ^ a2 ^ mul2[a3]); state[c] = (uint)(r0 << 24 | r1 << 16 | r2 << 8 | r3); } } } } ```