public void SubWord(List <FiniteField> word) { for (int i = 0; i < word.Count; i++) { word[i] = FiniteField.SBox(word[i]); } }
public static FiniteField operator ~(FiniteField a) { if (a == new FiniteField()) { return(new FiniteField()); } FiniteField t = new FiniteField(); FiniteField newt = new FiniteField("00000001"); FiniteField r = IrreduciblePolynomial; FiniteField newr = a; while (newr != new FiniteField()) { FiniteField quotient = r / newr; FiniteField prov2 = newr; newr = r + quotient * prov2; r = prov2; FiniteField prov = newt; newt = t + quotient * prov; t = prov; } return(t); }
public static FiniteField operator -(FiniteField a, FiniteField b) { if (a < b) { FiniteField c = new FiniteField(a.Count); c = a; a = b; b = c; } FiniteField temp = a.Clone(); int aStart = a.FirstNonZero; int bStart = b.FirstNonZero; if (b == new FiniteField()) { return(a); } for (int i = 0; i < b.Count - bStart; i++) { temp[i + aStart] = Convert.ToByte(a[i + aStart] ^ b[i + bStart]); } return(temp); }
public void RotWord(List <FiniteField> word) { FiniteField temp = word[0]; for (int i = 0; i < word.Count - 1; i++) { word[i] = word[i + 1]; } word[word.Count - 1] = temp; }
public static FiniteField operator %(FiniteField a, FiniteField b) { FiniteField reminder = a.Clone(); while (reminder >= b) { reminder -= b; } return(reminder); }
public static FiniteField operator *(FiniteField a, FiniteField b) { FiniteField product = new FiniteField(a.Count + b.Count - 1); for (int i = 0; i < a.Count; i++) { for (int j = 0; j < b.Count; j++) { product[i + j] = Convert.ToByte(a[i] & b[j] ^ product[i + j]); } } product.Cut(); return(product); }
public static FiniteField operator <<(FiniteField a, int count) { FiniteField temp = new FiniteField(a.Count); int index = temp.Count - count; for (int i = 0; i < a.Count; i++) { temp[index] = a[i]; index++; index %= a.Count; } return(temp); }
public StateMatrix InvSubBytes(StateMatrix stateMatrix) { StateMatrix subbedMatrix = new StateMatrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { subbedMatrix[j, i] = FiniteField.InvSBox(stateMatrix[j, i]); } } return(subbedMatrix); }
public void Rcon(ref FiniteField roundConstant, int round) { if (round == 1) { return; } else if (roundConstant < new FiniteField("10000000")) { roundConstant *= new FiniteField("00000010"); } else { roundConstant = roundConstant * new FiniteField("00000010") + new FiniteField("100011011"); } }
public static FiniteField operator /(FiniteField a, FiniteField b) { FiniteField quotient = new FiniteField(a.Count); FiniteField temp = a.Clone(); while (temp.Count - temp.FirstNonZero >= b.Count - b.FirstNonZero) { int aFirst = temp.Count - temp.FirstNonZero; int bFirst = b.Count - b.FirstNonZero; int shift = Math.Abs(aFirst - bFirst); quotient[quotient.Count - 1 - shift] = 1; temp -= b; } return(quotient); }
public StateMatrix InvMixColumns(StateMatrix stateMatrix) { StateMatrix mixedMatrix = new StateMatrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { mixedMatrix[i, j] = new FiniteField(); for (int k = 0; k < 4; k++) { mixedMatrix[i, j] += stateMatrix[k, j] * StateMatrix.InvC[i, k]; } } } return(mixedMatrix); }
public void Cut() { while (Coefficients.Length - FirstNonZero >= IrreduciblePolynomial.Count) { FiniteField reminder = this - IrreduciblePolynomial; Coefficients = reminder.Coefficients; } byte[] reduced = new byte[8]; int length = Coefficients.Length - 8; for (int i = 0; i < 8; i++) { reduced[i] = Coefficients[length + i]; } Coefficients = reduced; }
public static FiniteField operator +(FiniteField a, FiniteField b) { FiniteField temp; int shift; if (a.Count < b.Count) { temp = new FiniteField(b.Count); shift = b.Count - a.Count; for (int i = 0; i < shift; i++) { temp[i] = b[i]; } for (int i = 0; i < a.Count; i++) { temp[i + shift] = Convert.ToByte(a[i] ^ b[i + shift]); } } else if (b.Count < a.Count) { temp = new FiniteField(a.Count); shift = a.Count - b.Count; for (int i = 0; i < shift; i++) { temp[i] = a[i]; } for (int i = 0; i < b.Count; i++) { temp[i + shift] = Convert.ToByte(a[i + shift] ^ b[i]); } } else { temp = new FiniteField(a.Count); for (int i = 0; i < a.Count; i++) { temp[i] = Convert.ToByte(a[i] ^ b[i]); } } temp.Cut(); return(temp); }
static int Compare(FiniteField a, FiniteField b) { int indexA = 0; int indexB = 0; if (a.Count > b.Count) { while (indexA < a.Count - b.Count) { if (a[indexA] == 1) { return(1); } indexA++; } } if (b.Count > a.Count) { while (indexB < b.Count - a.Count) { if (b[indexB] == 1) { return(-1); } indexB++; } } for (int i = 0; i < Math.Min(a.Count, b.Count); i++) { if (a[i + indexA] < b[i + indexB]) { return(-1); } else if (a[i + indexA] > b[i + indexB]) { return(1); } } return(0); }
public void GenerateKey() { RoundKeys = new List <StateMatrix>(); StateMatrix roundKey = new StateMatrix(); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { roundKey[j, i] = new FiniteField(Convert.ToString(EncryptionKey[i * 4 + j], 2).PadLeft(8, '0')); } } FiniteField roundConstant = new FiniteField("00000001"); RoundKeys.Add(roundKey); for (int round = 1; round <= 10; round++) { roundKey = new StateMatrix(); List <FiniteField> word = new List <FiniteField>(); for (int i = 0; i < 4; i++) { word.Add(RoundKeys[round - 1][i, 3]); } RotWord(word); SubWord(word); Rcon(ref roundConstant, round); word[0] = word[0] + roundConstant; for (int i = 0; i < 4; i++) { roundKey[i, 0] = RoundKeys[round - 1][i, 0] + word[i]; } for (int i = 1; i < 4; i++) { for (int j = 0; j < 4; j++) { roundKey[j, i] = RoundKeys[round - 1][j, i] + roundKey[j, i - 1]; } } RoundKeys.Add(roundKey); } }
public static FiniteField SBox(FiniteField b) { FiniteField s = ~b; return(s + (s << 1) + (s << 2) + (s << 3) + (s << 4) + C); }
public static FiniteField InvSBox(FiniteField s) { FiniteField b = (s << 1) + (s << 3) + (s << 6) + InvC; return(~b); }