示例#1
0
 public void SubWord(List <FiniteField> word)
 {
     for (int i = 0; i < word.Count; i++)
     {
         word[i] = FiniteField.SBox(word[i]);
     }
 }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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;
        }
示例#5
0
        public static FiniteField operator %(FiniteField a, FiniteField b)
        {
            FiniteField reminder = a.Clone();

            while (reminder >= b)
            {
                reminder -= b;
            }

            return(reminder);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
 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");
     }
 }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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;
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
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);
            }
        }
示例#16
0
        public static FiniteField SBox(FiniteField b)
        {
            FiniteField s = ~b;

            return(s + (s << 1) + (s << 2) + (s << 3) + (s << 4) + C);
        }
示例#17
0
        public static FiniteField InvSBox(FiniteField s)
        {
            FiniteField b = (s << 1) + (s << 3) + (s << 6) + InvC;

            return(~b);
        }