Last active
December 13, 2017 18:17
-
-
Save th0rex/bba4c8d1328b8262f88506a5eff7b161 to your computer and use it in GitHub Desktop.
AES
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Compile with: clang++ -std=c++17 -O3 mix_columns.cpp -o mix_columns | |
// Run with: ./mix_columns | |
#include <stdint.h> | |
#include <array> | |
#include <iomanip> | |
#include <iostream> | |
#include <string> | |
template <unsigned I, typename T> | |
constexpr T bit_get(T input) noexcept { | |
return (input & (1 << I)) >> I; | |
} | |
template <unsigned I, typename T> | |
constexpr void bit_set(T& input, T value) noexcept { | |
input |= (value & 1) << I; | |
} | |
// Von Aufgabe 5b) | |
constexpr uint8_t mul2(uint8_t i) noexcept { | |
uint8_t ret = 0; | |
bit_set<7>(ret, bit_get<6>(i)); | |
bit_set<6>(ret, bit_get<5>(i)); | |
bit_set<5>(ret, bit_get<4>(i)); | |
bit_set<4>(ret, (uint8_t)(bit_get<3>(i) ^ bit_get<7>(i))); | |
bit_set<3>(ret, (uint8_t)(bit_get<2>(i) ^ bit_get<7>(i))); | |
bit_set<2>(ret, bit_get<1>(i)); | |
bit_set<1>(ret, (uint8_t)(bit_get<0>(i) ^ bit_get<7>(i))); | |
bit_set<0>(ret, bit_get<7>(i)); | |
return ret; | |
} | |
// Von Aufgabe 5c) | |
constexpr uint8_t mul3(uint8_t i) noexcept { | |
uint8_t ret = 0; | |
bit_set<7>(ret, (uint8_t)(bit_get<6>(i) ^ bit_get<7>(i))); | |
bit_set<6>(ret, (uint8_t)(bit_get<5>(i) ^ bit_get<6>(i))); | |
bit_set<5>(ret, (uint8_t)(bit_get<4>(i) ^ bit_get<5>(i))); | |
bit_set<4>(ret, (uint8_t)(bit_get<3>(i) ^ bit_get<4>(i) ^ bit_get<7>(i))); | |
bit_set<3>(ret, (uint8_t)(bit_get<2>(i) ^ bit_get<3>(i) ^ bit_get<7>(i))); | |
bit_set<2>(ret, (uint8_t)(bit_get<1>(i) ^ bit_get<2>(i))); | |
bit_set<1>(ret, (uint8_t)(bit_get<0>(i) ^ bit_get<1>(i) ^ bit_get<7>(i))); | |
bit_set<0>(ret, (uint8_t)(bit_get<0>(i) ^ bit_get<7>(i))); | |
return ret; | |
} | |
constexpr uint32_t mix_columns(uint32_t i) noexcept { | |
uint32_t ret = 0; | |
auto i0 = (uint8_t)((i >> 24) & 0xFF); | |
auto i1 = (uint8_t)((i >> 16) & 0xFF); | |
auto i2 = (uint8_t)((i >> 8) & 0xFF); | |
auto i3 = (uint8_t)((i >> 0) & 0xFF); | |
ret |= (mul2(i0) ^ mul3(i1) ^ i2 ^ i3) << 24; | |
ret |= (i0 ^ mul2(i1) ^ mul3(i2) ^ i3) << 16; | |
ret |= (i0 ^ i1 ^ mul2(i2) ^ mul3(i3)) << 8; | |
ret |= (mul3(i0) ^ i1 ^ i2 ^ mul2(i3)) << 0; | |
return ret; | |
} | |
struct P { | |
std::uint32_t b; | |
std::uint32_t k; | |
constexpr P(std::uint32_t i, std::uint32_t j) noexcept : b{i}, k{j} {} | |
}; | |
std::ostream& m(std::ostream& o) { | |
return o << std::hex << std::setfill('0') << std::setw(8); | |
} | |
void print(std::array<P, 4> x) { | |
for (auto i : x) { | |
std::cout << "Input: 0x" << m << i.b << " -- Output: 0x" << m | |
<< mix_columns(i.b) << " -- With key addition: 0x" << m | |
<< (mix_columns(i.b) ^ i.k) << '\n'; | |
} | |
} | |
int main() { | |
constexpr std::array<P, 4> a = { | |
P{0x299345F4, 0x923AB24F}, P{0x3B6D0694, 0x71C706DF}, | |
P{0x51DE539E, 0x8E42DF37}, P{0x3D0E2A5A, 0x27705318}}; | |
print(a); | |
std::cout << "------------------------------\nPlaintext nur 0en:\n"; | |
constexpr std::array<P, 4> b = { | |
P{0x299345F4, 0x923AB24F}, P{0x3B6D0694, 0x71C706DF}, | |
P{0x51DE539E, 0x8E42DF37}, P{0x2B0E2A5A, 0x27705318}}; | |
print(b); | |
std::cout << std::flush; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment