Skip to content

Instantly share code, notes, and snippets.

@th0rex
Last active December 13, 2017 18:17
Show Gist options
  • Save th0rex/bba4c8d1328b8262f88506a5eff7b161 to your computer and use it in GitHub Desktop.
Save th0rex/bba4c8d1328b8262f88506a5eff7b161 to your computer and use it in GitHub Desktop.
AES
// 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