#pragma once #include #include //The GF(2^8) field used in AES class GF28{ int value; static int reduce(int v,int m); public: static const int modulus=0x11b; static uint8_t multiply(uint8_t x,uint8_t y); //for when the class is overkill GF28(); explicit GF28(int v); explicit operator uint8_t() const; GF28& operator+=(GF28 o); GF28& operator-=(GF28 o); GF28& operator<<=(int n); //multiplication by x^n GF28 operator+(GF28 o) const; GF28 operator-(GF28 o) const; GF28 operator*(GF28 o) const; GF28 operator<<(int n) const; //multiplication by x^n bool operator==(GF28 o) const; GF28 inverse() const; friend std::ostream& operator<<(std::ostream&,GF28); }; std::ostream& operator<<(std::ostream &os,GF28 p);