Пример #1
0
        /// <summary>
        /// Вычисление вспомогательных ключей для шифровки(расшифровки) текста
        /// </summary>
        /// <param name="key"> 128-битный исходный ключ </param>
        /// <returns> true - формат исходного ключа верный; false - формат ключа не верный</returns>
        public bool SetKey(byte[] key)
        {
            if (key.Length != 16)
            {
                return(false);
            }

            ulong KAl, KAr;
            ulong KLl = Bswap(BitConverter.ToUInt64(key, 0));
            ulong KLr = Bswap(BitConverter.ToUInt64(key, 8));

            SecondaryFunc SF = new SecondaryFunc();

            eKey[0]  = KLl;
            eKey[1]  = KLr;
            eKey[4]  = (KLl << 15) | (KLr >> 49);
            eKey[5]  = (KLr << 15) | (KLl >> 49);
            eKey[10] = (KLl << 45) | (KLr >> 19);
            eKey[11] = (KLr << 45) | (KLl >> 19);
            eKey[13] = (KLr << 60) | (KLl >> 4);
            eKey[16] = (KLr << 13) | (KLl >> 51);
            eKey[17] = (KLl << 13) | (KLr >> 51);
            eKey[18] = (KLr << 30) | (KLl >> 34);
            eKey[19] = (KLl << 30) | (KLr >> 34);
            eKey[22] = (KLr << 47) | (KLl >> 17);
            eKey[23] = (KLl << 47) | (KLr >> 17);

            KAr  = SF.F128(KLl, 0xA09E667F3BCC908B);
            KAl  = SF.F128(KAr ^ KLr, 0xB67AE8584CAA73B2);
            KAr ^= SF.F128(KAl, 0xC6EF372FE94F82BE);
            KAl ^= SF.F128(KAr, 0x54FF53A5F1D36F1C);

            eKey[2]  = KAl;
            eKey[3]  = KAr;
            eKey[6]  = (KAl << 15) | (KAr >> 49);
            eKey[7]  = (KAr << 15) | (KAl >> 49);
            eKey[8]  = (KAl << 30) | (KAr >> 34);
            eKey[9]  = (KAr << 30) | (KAl >> 34);
            eKey[12] = (KAl << 45) | (KAr >> 19);
            eKey[14] = (KAl << 60) | (KAr >> 4);
            eKey[15] = (KAr << 60) | (KAl >> 4);
            eKey[20] = (KAr << 30) | (KAl >> 34);
            eKey[21] = (KAl << 30) | (KAr >> 34);
            eKey[24] = (KAr << 47) | (KAl >> 17);
            eKey[25] = (KAl << 47) | (KAr >> 17);

            return(true);
        }
Пример #2
0
        /// <summary>
        /// Производит 18-ти этапную расшифровку входных данных
        /// </summary>
        /// <param name="msg"> входной массив данных для расшифровки </param>
        /// <param name="eKey"> преобразованный набор ключей для расшифровки текста </param>
        /// <returns> возвращает преобразованный массив байтов </returns>

        public byte[] Decrypt(byte[] msg, ulong[] eKey)
        {
            byte[] c = new byte[msg.Length];

            ulong Ml = Bswap(BitConverter.ToUInt64(msg, 0));
            ulong Mr = Bswap(BitConverter.ToUInt64(msg, 8));

            SecondaryFunc SF = new SecondaryFunc();

            ulong Cr = Ml ^ eKey[24];
            ulong Cl = Mr ^ eKey[25];

            Cl ^= SF.F128(Cr, eKey[23]);
            Cr ^= SF.F128(Cl, eKey[22]);
            Cl ^= SF.F128(Cr, eKey[21]);
            Cr ^= SF.F128(Cl, eKey[20]);
            Cl ^= SF.F128(Cr, eKey[19]);
            Cr ^= SF.F128(Cl, eKey[18]);

            Cr = SF.FL128(Cr, eKey[17]);
            Cl = SF.FLi128(Cl, eKey[16]);

            Cl ^= SF.F128(Cr, eKey[15]);
            Cr ^= SF.F128(Cl, eKey[14]);
            Cl ^= SF.F128(Cr, eKey[13]);
            Cr ^= SF.F128(Cl, eKey[12]);
            Cl ^= SF.F128(Cr, eKey[11]);
            Cr ^= SF.F128(Cl, eKey[10]);

            Cr = SF.FL128(Cr, eKey[9]);
            Cl = SF.FLi128(Cl, eKey[8]);

            Cl ^= SF.F128(Cr, eKey[7]);
            Cr ^= SF.F128(Cl, eKey[6]);
            Cl ^= SF.F128(Cr, eKey[5]);
            Cr ^= SF.F128(Cl, eKey[4]);
            Cl ^= SF.F128(Cr, eKey[3]);
            Cr ^= SF.F128(Cl, eKey[2]);

            Cl ^= eKey[0];
            Cr ^= eKey[1];

            Buffer.BlockCopy(BitConverter.GetBytes(Bswap(Cl)), 0, c, 0, 8);
            Buffer.BlockCopy(BitConverter.GetBytes(Bswap(Cr)), 0, c, 8, 8);

            return(c);
        }