Beispiel #1
0
 public String GetSHA3_Keccak256(Param p)
 {
     byte[] h;
     if (p.Fs != null)
     {
         h = SHA3.CreateKeccak256().ComputeHash(p.Fs);
     }
     else
     {
         h = SHA3.CreateKeccak256().ComputeHash(Settings.GetEncoding().GetBytes(p.ValueToHash));
     }
     return(BitConverter.ToString(h));
 }
Beispiel #2
0
Datei: Node.cs Projekt: fdsc/old
        protected static void newSessionGuid()
        {
            lock (syncObject)
            {
                var    bb     = new BytesBuilder();
                byte[] target = null;

                BytesBuilder.ULongToBytes((ulong)DateTime.Now.Ticks, ref target);
                bb.add(target);
                bb.add(staticBytes);

                sessionGuid = SHA3.generateRandomPwd(bb.getBytes(), 20);
            }
        }
Beispiel #3
0
        public override void ProcessCryptoVariant(long variant)
        {
            SHA3 gs    = new SHA3(0);
            var  key   = prepareKey(variant);
            var  s     = prepareOIV(variant);
            int  pc    = 1;
            var  gamma = gs.getDerivatoKey(key, s, 2, ref pc, 1, 4);

            if (gamma[0] == 0)
            {
                c1++;
            }

            calcResult(gamma, variant, key);
        }
Beispiel #4
0
        private static bool testForBits_getMultiHash40(ref int pc, int hc, SHA3 sha)
        {
            var size  = 32;
            var sizeb = size << 3;

            byte[] result = null;
            byte[] inData = new byte[size];

            int[,] counts = new int[sizeb, sizeb];

            BytesBuilder.ToNull(inData);
            for (int i = 0; i < sizeb; i++)
            {
                setBitInArray(inData, i);

                for (int j = 0; j < sizeb; j++)
                {
                    if (i == j)
                    {
                        continue;
                    }

                    setBitInArray(inData, j);

                    SHA3.getMultiHash40(inData, out result, ref pc, hc, sha, size);
                    //SHA3.getMultiHash20(inData, out result, ref pc, hc, sha, size);
                    //result = sha.getHash512(inData);
                    //result = new testCiphers.RC4(inData).getGamma(size);
                    toResult(sizeb, i, j, result, counts);

                    setBitInArray(inData, j, false);
                }

                setBitInArray(inData, i, false);
            }

            double суммарнаяВероятность, минимальнаяВероятность, множительВероятностей, отклонениеОтЭталона, отклонениеОтЭталонаВниз, отклонениеОтЭталонаВверх;

            double[,] вероятность;
            getCountsResult(sizeb, counts, out вероятность, out минимальнаяВероятность, out множительВероятностей, out суммарнаяВероятность, out отклонениеОтЭталона, out отклонениеОтЭталонаВниз, out отклонениеОтЭталонаВверх);

            if (множительВероятностей > 1.01 || суммарнаяВероятность < 0.01 || отклонениеОтЭталонаВниз > 0.10 || отклонениеОтЭталонаВверх > 0.10 || минимальнаяВероятность < 0.001)
            {
                return(false);
            }

            return(true);
        }
Beispiel #5
0
        static void Main()
        {
            var stopwatch = new Stopwatch();


            byte[] data = { 0, 0, 5, 1, 1, 2 };
            string word = "abc";

            HashAlgorithm hash = new HashFunctions.SHA1();

            stopwatch.Start();
            Console.WriteLine($@"Proper HASH SHA1(data): {ByteArrayToString(hash.ComputeHash(data))}");
            stopwatch.Stop();
            Console.WriteLine($"Data hashed in: {stopwatch.Elapsed} s");
            stopwatch.Reset();
            stopwatch.Start();
            Console.WriteLine($"Proper HASH SHA1 (word): {ByteArrayToString(hash.ComputeHash(Encoding.ASCII.GetBytes(word)))}");
            stopwatch.Stop();
            Console.WriteLine($"Data hashed in: {stopwatch.Elapsed} s");
            Console.WriteLine($"Data hashed in: {stopwatch.ElapsedTicks} ticks");
            Console.WriteLine($"Speed of hashing: {Encoding.ASCII.GetBytes(word).Length * 1000000 / stopwatch.Elapsed.Ticks} bps");


            SHA3 hash5 = new SHA3(256);

            stopwatch.Reset();
            stopwatch.Start();
            Console.WriteLine($"Proper HASH SHA3-512 (word): {ByteArrayToString(hash5.ComputeHash(Encoding.UTF8.GetBytes(word)))}");
            stopwatch.Stop();
            Console.WriteLine($"Data hashed in: {stopwatch.Elapsed} s");
            Console.WriteLine($"Data hashed in: {stopwatch.ElapsedTicks} ticks");
            Console.WriteLine($"Speed of hashing: {((double)(Encoding.ASCII.GetBytes(word).Length / 1024) * 1000L * 1000L * 10L / (stopwatch.ElapsedTicks)):f2} bps");


            SHA2Managed hash6 = new SHA2Managed(512);

            stopwatch.Reset();
            Console.WriteLine($"Proper HASH SHA-512(word): {ByteArrayToString(hash6.ComputeHash(Encoding.UTF8.GetBytes(word)))}");

            SHA2Managed hash7 = new SHA2Managed(224);

            stopwatch.Reset();
            Console.WriteLine($"Proper HASH SHA-224(word): {ByteArrayToString(hash7.ComputeHash(Encoding.UTF8.GetBytes(word)))}");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new HashFunctionAnalizerForm());
        }
        public static string ToEIP55(string address)
        {
            bool   prefix = address.HasHexPrefix();
            string addr   = address.ToLower().RemoveHexPrefix();
            string hash   = SHA3.Hash256(addr).ToHex();

            string eip55 = "";

            for (int i = 0; i < addr.Length; i++)
            {
                string c = hash[i].ToString();
                eip55 += Convert.ToByte(hash[i].ToString(), 16) >= 8 ? addr[i].ToString().ToUpper() : addr[i].ToString();
            }

            return((prefix ? HexExtension.HexPrefix : "") + eip55);
        }
Beispiel #7
0
        private static void GetPasswordAndDecryptFile(FileInfo fi, out byte[] bt, DoublePasswordForm pwdForm1)
        {
            byte[] key;
            int    regime;

            using (var file = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                file.Position = 1;
                regime        = file.ReadByte();
            }

            GetKeyByPassword(pwdForm1, out key, regime);

/*
 #warning INSECURE
 * File.AppendAllText("unsecure.log", "key: " + BitConverter.ToString(key).Replace("-", "") + "\r\n");
 */
            pwdForm1.clearResultText();

            var sha = new SHA3(fi.Length);

            if (regime < 10)
            {
                sha.useOldDuplex = true;
            }

            var cbt = File.ReadAllBytes(fi.FullName);

            try
            {
                bt = sha.multiDecryptLZMA(cbt, key);
            }
            catch (Exception e)
            {
                MessageBox.Show("Расшифрование не удалось, возможно файл не является файлом программы rtbd. " + e.Message, "Расшифрование не удалось", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                bt = null;
                return;
            }
            finally
            {
                sha.Clear(true);
                BytesBuilder.ToNull(key);
                BytesBuilder.ToNull(cbt);
                cbt = null;
                key = null;
            }
        }
Beispiel #8
0
        public string decrypt(string base64str, PasswordSecure pwd = null)
        {
            if (pwd == null)
            {
                pwd = key;
            }

            var sha     = new SHA3(base64str.Length);
            var openKey = pwd.getObjectValue();
            var crypted = sha.multiDecryptLZMA(Convert.FromBase64String(base64str), openKey);

            BytesBuilder.BytesToNull(openKey);

            var result = new UTF32Encoding().GetString(crypted); //Convert.ToBase64String(crypted);

            BytesBuilder.ToNull(crypted);
            return(result);
        }
Beispiel #9
0
        public override void ProcessCryptoVariant(long variant)
        {
            var key   = prepareKey(variant);
            var gamma = SHA3.generateRandomPwdByDerivatoKey(key, keyLen);

            if (gamma[0] == 1)
            {
                if ((variant & 1) > 0)
                {
                    c1f++;
                }
                else
                {
                    c1t++;
                }
            }

            calcResult(gamma, variant, key);
        }
Beispiel #10
0
        private static bool checkDuplexByHash(SHA3 sha3)
        {
            byte[] keyAndMessage = new byte[72 * 8 - 1];

            var rnd = new Random(98732796);

            for (int i = 0; i < 64; i++)
            {
                keyAndMessage[i] = (byte)rnd.Next(0, 255);
            }

            keyAndMessage[64] = 0x01;
            keyAndMessage[71] = 0x80;

            for (int i = 72; i < keyAndMessage.Length; i++)
            {
                keyAndMessage[i] = (byte)rnd.Next(0, 255);
            }

            byte[] hash  = sha3.getHash512(keyAndMessage);
            byte[] gamma = sha3.getDuplex(keyAndMessage);

            bool errorFlag = false;

            for (int i = 0; i < hash.Length; i++)
            {
                if (hash[i] != gamma[gamma.Length - 72 + i])
                {
                    errorFlag = true;
                }
            }

            if (errorFlag)
            {
                Console.WriteLine("Duplex and hash unequal, duplex is incorrect");
            }
            else
            {
                Console.WriteLine("Well. Duplex and hash equal, duplex is correct.");
            }

            return(!errorFlag);
        }
Beispiel #11
0
        public override void ProcessCryptoVariant(long variant)
        {
            SHA3 gs1 = new SHA3(0);
            SHA3 gs2 = new SHA3(0);
            var  key = prepareKey(variant);
            var  s   = prepareOIV(variant);

            var bt = Convert.FromBase64String("GL4C/c+hpZrVQcIg771ujdjHN/2Jqoj+UpS6cZ5fbG7zU1qwXMMg5P3YgnLY9byB1laMMu557wK1J7EewmkKJ0wPjA8u3uVO7oOhmtVSc6rnGMCaTrRHtLVLv9a9dBFnNxGjxbCLOcaGkZZYeBT1KUraXh/5reXVQmedmkijKvEwJ4d3CPSMUoPGca+lv7I=");
            var g1 = gs1.getDuplex(bt);
            var g2 = gs2.getDuplex(key);

            g1 = gs1.getDuplex(g2, true);
            g2 = gs2.getDuplex(g1, true);

            g1 = gs1.getDuplex(g2, true);
            g2 = gs2.getDuplex(g1, true);
            g1 = gs1.getDuplex(g2, true);
            g2 = gs2.getDuplex(g1, true);
            g1 = gs1.getDuplex(g2, true);
            g2 = gs2.getDuplex(g1, true);
            g1 = gs1.getDuplex(g2, true);
            g2 = gs2.getDuplex(g1, true);

            var gamma = gs1.getDuplexMod(g1, g2);


            if (gamma[0] == 1)
            {
                if ((variant & 1) > 0)
                {
                    c1f++;
                }
                else
                {
                    c1t++;
                }
            }

            calcResult(gamma, variant, key);
        }
Beispiel #12
0
        public virtual void ProcessCryptoVariant(long variant)
        {
            SHA3 gs  = new SHA3(0);
            var  key = prepareKey(variant);
            var  s   = prepareOIV(variant);

            /*gs.prepareGamma(key, s);
             * var gamma = gs.getGamma(numOfOutBytes);*/

            var v = numOfInVariants;
            int c = 0;

            for (c = 0; v > 1; c++)
            {
                v >>= 1;
            }
            for (; c > 0; c--)
            {
                v <<= 1;
            }

            var e = variant >> 1;

            byte[] gamma = new byte[numOfOutBytes];
            for (int gc = 0; gc < numOfOutBytes; gc++)
            {
                if ((variant & v) > 0)
                {
                    gamma[gc] = (byte)e;
                }
                else
                {
                    gamma[gc] = (byte)(e ^ 0xFFFF);
                }
            }

            calcResult(gamma, variant, key);
        }
Beispiel #13
0
        public override void ProcessCryptoVariant(long variant)
        {
            SHA3 gs  = new SHA3(0);
            var  key = prepareKey(variant);
            var  s   = prepareOIV(variant);

            gs.prepareGamma(key, s);
            var gamma = gs.getGamma(numOfOutBytes);

            if (gamma[0] == 1)
            {
                if ((variant & 1) > 0)
                {
                    c1f++;
                }
                else
                {
                    c1t++;
                }
            }

            calcResult(gamma, variant, key);
        }
Beispiel #14
0
        private void FileEncrypt(byte[] key, string FileName, int regime, int hashCount, bool LZMA)
        {
            GC.Collect();

            var bytes = File.ReadAllBytes(FileName);
            var sha   = new SHA3(bytes.LongLength);

            var crypted = sha.multiCryptLZMA(bytes, key, null, (byte)regime, LZMA, (byte)(LZMA ? 19 : 0), hashCount);

            BytesBuilder.ToNull(key);
            BytesBuilder.ToNull(bytes);
            sha.Clear(true);
            bytes = null;
            key   = null;

            File.WriteAllBytes(CryptFileName, crypted);
            BytesBuilder.ToNull(crypted);
            crypted = null;

            if (this.InvokeRequired)
            {
                try
                {
                    this.Invoke(new postFileEncryptFunc(this.postFileEncrypt));
                }
                catch
                {
                    postFileEncrypt();
                }
            }
            else
            {
                postFileEncrypt();
            }

            // MessageBox.Show("Файл зашифрован\r\nПроверьте возможность расшифровки\r\nУдалите нешифрованный файл, если это требуется", "Шифрование файла " + FileName, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
Beispiel #15
0
        public string crypt(string str, PasswordSecure pwd = null)
        {
            if (pwd == null)
            {
                pwd = key;
            }

            var sha = new SHA3(str.Length);

            if (random == null)
            {
                var inits = str + DateTime.Now.ToString("r");
                var t     = new UTF32Encoding().GetBytes(inits);
                var bbi   = new BytesBuilder();
                bbi.add(t);
                bbi.add(sha.CreateInitVector(0, 64, 40));
                var init = bbi.getBytes();

                random = new SHA3.SHA3Random(init);

                bbi.clear();
                BytesBuilder.ClearString(inits);
                BytesBuilder.ToNull(init);
            }

            var bytes = new UTF32Encoding().GetBytes(str);

            var openKey = pwd.getObjectValue();
            var crypted = sha.multiCryptLZMA(bytes, openKey, null, 22, false);

            BytesBuilder.BytesToNull(openKey);
            BytesBuilder.BytesToNull(bytes);
            BytesBuilder.ClearString(str);

            return(Convert.ToBase64String(crypted));
        }
Beispiel #16
0
        public override void ProcessCryptoVariant(long variant)
        {
            SHA3 gs1 = new SHA3(0);
            SHA3 gs2 = new SHA3(0);
            //SHA3 gs3 = new SHA3(0);

            var key = prepareKey(variant);
            var s   = prepareOIV(variant);

            gs1.prepareGamma(key, s);
            var gamma = gs1.getGamma(71);

            gs2.prepareGamma(gamma, s);
            gamma = gs1.getDuplex(gamma, true);
            gamma = gs2.getDuplex(gamma, true);

            gamma = gs1.getDuplex(gamma, true);
            gamma = gs2.getDuplex(gamma, true);

            gamma = gs1.getDuplex(gamma, true);
            gamma = gs2.getDuplex(gamma, true);

            if (gamma[0] == 1)
            {
                if ((variant & 1) > 0)
                {
                    c1f++;
                }
                else
                {
                    c1t++;
                }
            }

            calcResult(gamma, variant, key);
        }
Beispiel #17
0
        private static void GammaTest(ref int errorFlag)
        {
            var keccak = new SHA3(0);

            byte[]   k1 = new byte[360], k2 = new byte[64], k3 = new byte[64], a = new byte[64], b = new byte[64], e1 = new byte[64], e2 = new byte[64];
            byte[][] g1 = new byte[10][];
            byte[][] g2 = new byte[10][];

            var keys = new List <byte[]>();
            var oi   = new List <byte[]>();

            keys.Add(k3);
            keys.Add(k2);
            keys.Add(k1);
            oi.Add(e1);
            oi.Add(e2);
            a[0]  = 1;
            b[63] = 1;

            int gr = 10;

            GetGammaForCheck(keccak, k2, k3, a, b, g1, g2, keys, oi, gr);

            byte[] numberse = new byte[] { 0, 7 };
            foreach (var n in numberse)
            {
                foreach (var m in numberse)
                {
                    if (n < m)
                    {
                        if (!BytesBuilder.Compare(g1[n], g1[m]))
                        {
                            goto error;
                        }
                    }
                }
            }

            byte[] numbersne = new byte[] { 0, 1, 2, 3, 4, 5, 6, 8, 9 };
            foreach (var n in numbersne)
            {
                foreach (var m in numbersne)
                {
                    if (n < m)
                    {
                        if (BytesBuilder.Compare(g1[n], g1[m]))
                        {
                            goto error;
                        }
                    }
                }
            }

            gr = 11;
            GetGammaForCheck(keccak, k2, k3, a, b, g1, g2, keys, oi, gr);

            numberse = new byte[] { 0, 7 };
            foreach (var n in numberse)
            {
                foreach (var m in numberse)
                {
                    if (n < m)
                    {
                        if (!BytesBuilder.Compare(g1[n], g1[m]))
                        {
                            goto error;
                        }
                    }
                }
            }

            numbersne = new byte[] { 0, 1, 2, 3, 4, 5, 6, 8, 9 };
            foreach (var n in numbersne)
            {
                foreach (var m in numbersne)
                {
                    if (n < m)
                    {
                        if (BytesBuilder.Compare(g1[n], g1[m]))
                        {
                            goto error;
                        }
                    }
                }
            }


            gr = 12;
            GetGammaForCheck(keccak, k2, k3, a, b, g1, g2, keys, oi, gr);

            numberse = new byte[] { 0, 7 };
            foreach (var n in numberse)
            {
                foreach (var m in numberse)
                {
                    if (n < m)
                    {
                        if (!BytesBuilder.Compare(g1[n], g1[m]))
                        {
                            goto error;
                        }
                    }
                }
            }

            numbersne = new byte[] { 0, 1, 2, 3, 4, 5, 6, 8, 9 };
            foreach (var n in numbersne)
            {
                foreach (var m in numbersne)
                {
                    if (n < m)
                    {
                        if (BytesBuilder.Compare(g1[n], g1[m]))
                        {
                            goto error;
                        }
                    }
                }
            }


            return;

error:
            Interlocked.Increment(ref errorFlag);
            Console.WriteLine("GammaTest is incorrect");
        }
Beispiel #18
0
 private string ComputeHash(SHA3 algorithm, string plainText)
 {
     return(Hash
            .FromBytes(algorithm.ComputeHash(plainText.ToByteArray()))
            .ToString());
 }
Beispiel #19
0
        private void recryptFile()
        {
            DoublePasswordForm pwdForm1, pwdForm2 = null;
            bool isSuccess = false;

            do
            {
                pwdForm1 = new DoublePasswordForm(1);
                pwdForm1.ShowDialog();

                if (pwdForm1.resultText == null)
                {
                    return;
                }

                if (pwdForm1.resultText.Length < 6)
                {
                    MessageBox.Show("Извините, но введённый текст настолько мал, что не может являться паролем", "Шифрование", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    continue;
                }

                if (pwdForm1.fromFile)
                {
                    break;
                }

                pwdForm2 = new DoublePasswordForm(2);
                pwdForm2.ShowDialog();

                if (pwdForm2.cancel)
                {
                    pwdForm1.clearResultText();
                    return;
                }

                if (!String.IsNullOrEmpty(pwdForm2.resultText) && pwdForm1.resultText != pwdForm2.resultText)
                {
                    pwdForm1.clearResultText();
                    pwdForm2.clearResultText();
                    if (MessageBox.Show("Введённые пароли не равны друг другу\r\nХотите попробовать ещё раз?", "Шифрование", MessageBoxButtons.YesNo) != System.Windows.Forms.DialogResult.Yes)
                    {
                        return;
                    }
                }
                else
                {
                    isSuccess = true;
                }
            }while (!isSuccess);

            byte[] newKey1;
            Form1.GetKeyByPassword(pwdForm1, out newKey1, 10);
            pwdForm1.clearResultText();
            pwdForm2.clearResultText();

            var sha    = new SHA3(0);
            var newKey = new PasswordSecure(newKey1);

            foreach (var record in records)
            {
                record.Value.pwd   = crypt(decrypt(record.Value.pwd), newKey);
                record.Value.crypt = crypt(decrypt(record.Value.crypt), newKey);
            }

            ClearKey();
            key = newKey;

            recordsToFile();
        }
Beispiel #20
0
        void cnt_closedEventDecrypt(Form1.OpenFileDialogContext context, bool isOK)
        {
            if (!isOK)
            {
                return;
            }

toStart:

            DoublePasswordForm pwdForm1, pwdForm2 = null;
            bool isSuccess = false;

            do
            {
                pwdForm1 = new DoublePasswordForm(1, Path.GetFileName(context.dialog.FileName));
                pwdForm1.ShowDialog();

                if (pwdForm1.resultText == null)
                {
                    return;
                }

                if (pwdForm1.resultText.Length < 6)
                {
                    MessageBox.Show("Извините, но введённый текст настолько мал, что не может являться паролем", "Шифрование", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    continue;
                }

                if (pwdForm1.fromFile)
                {
                    break;
                }

                pwdForm2 = new DoublePasswordForm(2, Path.GetFileName(context.dialog.FileName));
                pwdForm2.ShowDialog();

                if (pwdForm2.cancel)
                {
                    pwdForm1.clearResultText();
                    return;
                }

                if (!String.IsNullOrEmpty(pwdForm2.resultText) && pwdForm1.resultText != pwdForm2.resultText)
                {
                    pwdForm1.clearResultText();
                    pwdForm2.clearResultText();
                    if (MessageBox.Show("Введённые пароли не равны друг другу\r\nХотите попробовать ещё раз?", "Шифрование", MessageBoxButtons.YesNo) != System.Windows.Forms.DialogResult.Yes)
                    {
                        return;
                    }
                }
                else
                {
                    isSuccess = true;
                }
            }while (!isSuccess);

            ClearKey();
            ClearWindow();

            byte[] key1;
            Form1.GetKeyByPassword(pwdForm1, out key1, 22);
            pwdForm1.clearResultText();
            pwdForm2.clearResultText();

            var sha = new SHA3(0);

            var fi = new FileInfo(context.dialog.FileName);

            fileName = fi.FullName;
            if (!fi.Exists)
            {
                var newBytes = sha.multiCryptLZMA(new byte[0], key1, null, 12, false, 0, SHA3.getHashCountForMultiHash() - 8);
                File.WriteAllBytes(fileName, newBytes);
            }

            try
            {
                var openFile      = File.ReadAllBytes(fileName);
                var decryptedFile = sha.multiDecryptLZMA(openFile, key1);

                if (decryptedFile == null)
                {
                    MessageBox.Show("Файл расшифровать не удалось");
                    BytesBuilder.BytesToNull(key1);
                    goto toStart;
                }

                this.key = new PasswordSecure(key1);
                var str = Encoding.UTF32.GetString(decryptedFile);

                BytesBuilder.ToNull(openFile);
                BytesBuilder.ToNull(decryptedFile);

                GetRecordsFromFile(str);
                BytesBuilder.ClearString(str);
            }
            catch (Exception e)
            {
                MessageBox.Show("Расшифрование не удалось! " + e.Message, "Расшифрование не удалось", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            SetTagsAndMainTags();
        }
Beispiel #21
0
        /*
         *              gg.prepareGamma(key, s, Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProB, Gost28147Modified.CryptoProC, Gost28147Modified.CryptoProD, Gost28147Modified.ESbox_A, Gost28147Modified.ESbox_B);
         *              var gamma = gg.getGamma(GC + 1, true);*/
/*
 *                      gs.prepareGamma(key, s);
 *                      var gamma = gs.getGamma(GC + 1);
 */
        //var gamma = gg.getGOSTGamma(key, s, Gost28147Modified.ESbox_B, 8);

        /*gg.prepareGamma(key, s, Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProB, Gost28147Modified.CryptoProC, Gost28147Modified.CryptoProD, Gost28147Modified.ESbox_A, Gost28147Modified.ESbox_B);
         * var gamma = gg.getGamma(512, true);*/

        /*gs.prepareGamma(key, s);
         * var gamma = gs.getGamma();*/

        //var gamma = gg.getGOSTGamma(key, s, Gost28147Modified.ESbox_B, 8);
        //var gamma = gs.getDerivatoKey(key, s, hashCount, ref pc, 512, regime);


        /*gg.prepareGamma(key, s, Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProB, Gost28147Modified.CryptoProC, Gost28147Modified.CryptoProD, Gost28147Modified.ESbox_A, Gost28147Modified.ESbox_B);
         * var gamma = gg.getGamma(512, true);*/
        /*
         *                gs.prepareGamma(key, s);
         *                var gamma = gs.getGamma();
         * */
        /*
         *                  var gamma = gg.getGOSTGamma(key, s, Gost28147Modified.ESbox_B, 8);
         * /*
         *                  byte[] gamma = new byte[72];
         *                  SHA3.getMultiHash20(key, out gamma, ref pc, hashCount, gs);
         */
        /*
         * var lk = gs.GetKeysFromKeyData(key, s, hashCount, 20, ref pc);
         * var ls = gs.GetOIVectorsFromKeyData(lk.Count, s, hashCount);
         * var gamma = gs.getMACHashMod(s, lk, ls, pc, hashCount);
         */


        private static void testPermutation(object sync, int MC, int pc, int hashCount, int GC)
        {
            if (MC > 14)
            {
                throw new ArgumentOutOfRangeException("MC", "MC must be <= 14");
            }
#if !fillKey1
            tgmgSuccess = 1;
#else
            tgmgSuccess = 4;
#endif
            tgmgResultInt = 0;


#if AGOST || AD
            var SL = 32;
#elif AGOSTM
            var SL = 160;
#elif AGOSTM2 || AGOSTM2E
            var SL = 128;
#elif APH
            var SL = 256;
#else
            var SL = 64;
#endif

            for (int counter = 0; counter < tgmgSuccess; counter++)
            {
                int CK = 0;
                if (counter == 1)
                {
                    CK = SL - 4;
                }
                else
                if (counter == 2)
                {
                    CK = SL >> 1;
                }
                else
                if (counter == 3)
                {
                    CK = (SL >> 1) + (SL >> 2);
                }

                int counterA = counter;

                ThreadPool.QueueUserWorkItem
                (
                    delegate
                {
                    var error = 0;

                    int Max  = 1 << (MC + 2);
                    var key  = new byte[SL];
                    var s    = new byte[64];
                    var stat = new int[2, 16, 256, GC];
                    var stab = new int[2, 2, 16, 16, GC];

                    var gg = new Gost28147Modified();
                    var gs = new SHA3(0);
                    for (int i = 0; i < Max; i++)
                    {
                        fillKey(CK, i, ref key);

                        //byte[] gamma = MergePermutation.getGamma(key, 512, out t);

#if AGOSTM
                        gg.prepareGamma(key, s, Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProB, Gost28147Modified.CryptoProC, Gost28147Modified.CryptoProD, Gost28147Modified.ESbox_A, Gost28147Modified.ESbox_B);
                        var gamma = gg.getGamma(GC + 1, 33 - 21);
#elif AGOSTM2
                        gg.prepareGamma(key, s, Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProB, null, null, null, null, false);
                        var gamma = gg.getGamma(GC + 1, false);
#elif AGOSTM2E
                        gg.prepareGamma(key, s, Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProB, null, null, null, null, true);
                        var gamma = gg.getGamma(GC + 1, 33 - 21);
#elif AGOST
                        var gamma = gg.getGOSTGamma(key, s, Gost28147Modified.ESbox_B, GC);
#elif ASHA3
                        gs.prepareGamma(key, s);
                        var gamma = gs.getGamma(GC);
#elif AExHash
                        var gamma = SHA3.getExHash(4, s, key);
#elif AMH20
                        byte[] gamma = new byte[GC];
                        SHA3.getMultiHash20(key, out gamma, ref pc, hashCount, gs);
#elif AMACHASHMOD
                        var lk    = gs.GetKeysFromKeyData(key, s, hashCount, 20, ref pc);
                        var ls    = gs.GetOIVectorsFromKeyData(lk.Count, s, hashCount);
                        var gamma = gs.getMACHashMod(s, lk, ls, pc, hashCount);
#elif ARC4
                        var RC4   = new RC4(key);
                        var gamma = RC4.getGamma(GC);
#elif ARC4Plus
                        var RC4   = new RC4(key);
                        var gamma = RC4.getGamma2(GC);
#elif AMD5
                        var md5   = System.Security.Cryptography.MD5.Create();
                        var gamma = md5.ComputeHash(key);
#elif APH
                        var gamma = MergePermutation.getHash(key, GC);
#elif AD
                        var gamma = SHA3.generateRandomPwdByDerivatoKey(key, GC);
#elif ADerivato
                        var gamma = gs.getDerivatoKey(key, /*new UTF8Encoding().GetBytes("passwordJjVjRyjcWwo7761qPBQUb3Sx8DACNpassword")*/ Convert.FromBase64String("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"),
                                                      22 >= 20 ? 16 : 1024, ref pc, GC, 22 / 10);
#elif A20
                        var gamma = new byte[GC];
                        gamma     = gs.multiCryptLZMA(gamma, key, s, 20, false, 19, 4);
                        gamma     = BytesBuilder.CloneBytes(gamma, 4 + s.Length, GC + 4 + s.Length);
#elif A22
                        var gamma = new byte[GC];
                        gamma     = gs.multiCryptLZMA(gamma, key, s, 22, false, 19, 4);
                        var L     = gamma.Length - s.Length - 4;
                        gamma     = BytesBuilder.CloneBytes(gamma, gamma.Length - L, L);
#elif ARC4Mod
                        var RC4   = new RC4Mod(key);
                        var gamma = RC4.getGamma(GC);
#elif Perm
                        int slen  = 256;
                        var gamma = MergePermutation.getGamma(key, GC, out slen);
#else
                        byte[] gamma = new byte[GC];
                        for (int gc = 0; gc < GC; gc++)
                        {
                            if ((i & 512) > 0)
                            {
                                gamma[gc] = (byte)i;
                            }
                            else
                            {
                                gamma[gc] = (byte)(i ^ 0xFFFF);
                            }
                        }
#endif

                        for (int gc = 0; gc < GC; gc++)
                        {
                            int C = 1;
                            for (int j = 0; j < MC; j++, C <<= 1)
                            {
                                stat[(i & C) > 0 ? 1 : 0, j, gamma[gc], gc]++;
                            }

                            C = 1;
                            for (int j = 0; j < MC; j++, C <<= 1)
                            {
                                int C2 = 1;
                                for (int j2 = 0; j2 < 8; j2++, C2 <<= 1)
                                {
                                    stab[(gamma[gc] & C2) > 0 ? 1 : 0, (i & C) > 0 ? 1 : 0, j, j2, gc]++;
                                }
                            }
                        }
                    }

                    int max  = 0;
                    int min  = int.MaxValue;
                    int summ = 0;

                    int max2  = 0;
                    int min2  = int.MaxValue;
                    int summ2 = 0;

                    for (int k01 = 0; k01 <= 1; k01++)
                    {
                        for (int gc = 0; gc < GC; gc++)
                        {
                            for (int i = 0; i < MC; i++)
                            {
                                for (int j = 0; j < 256; j++)
                                {
                                    if (stat[k01, i, j, gc] > max)
                                    {
                                        max = stat[k01, i, j, gc];
                                    }

                                    if (stat[k01, i, j, gc] < min)
                                    {
                                        min = stat[k01, i, j, gc];
                                    }

                                    summ += stat[k01, i, j, gc];
                                }

                                for (int ib = 0; ib < 2; ib++)
                                {
                                    for (int j2 = 0; j2 < 8; j2++)
                                    {
                                        if (stab[k01, ib, i, j2, gc] > max2)
                                        {
                                            max2 = stab[k01, ib, i, j2, gc];
                                        }

                                        if (stab[k01, ib, i, j2, gc] < min2)
                                        {
                                            min2 = stab[k01, ib, i, j2, gc];
                                        }

                                        summ2 += stab[k01, ib, i, j2, gc];
                                    }
                                }
                            }
                        }
                    }

                    /*summ  /= Max*MC;
                     * summ2 /= Max*MC*GC;
                     * */
                    float ms1 = Max * GC * MC / (2f * GC * MC * 256f);
                    float ms2 = Max * GC * MC * 8f / (2f * GC * MC * 2f * 8f);

                    if (GC < 2)
                    {
                        if ((float)max / (float)min >= 4.7)
                        {
                            error++;
                        }
                        if ((float)max / ms1 >= 1.8)
                        {
                            error++;
                        }
                        if (ms1 / (float)min >= 2.7)
                        {
                            error++;
                        }

                        if ((float)max2 / (float)min2 >= 1.07)
                        {
                            error++;
                        }
                        if ((float)max2 / ms2 >= 1.04)
                        {
                            error++;
                        }
                        if ((float)ms2 / (float)min2 >= 1.04)
                        {
                            error++;
                        }
                    }
                    else
                    if (GC < 73)
                    {
                        if ((float)max / (float)min >= 8.89)
                        {
                            error++;
                        }
                        if ((float)max / ms1 >= 2.0)
                        {
                            error++;
                        }
                        if (ms1 / (float)min >= 4.58)
                        {
                            error++;
                        }

                        if ((float)max2 / (float)min2 >= 1.11)
                        {
                            error++;
                        }
                        if ((float)max2 / ms2 >= 1.06)
                        {
                            error++;
                        }
                        if ((float)ms2 / (float)min2 >= 1.06)
                        {
                            error++;
                        }
                    }
                    else
                    {
                        if ((float)max / (float)min >= 11.51)
                        {
                            error++;
                        }
                        if ((float)max / ms1 >= 2.19)
                        {
                            error++;
                        }
                        if (ms1 / (float)min >= 5.34)
                        {
                            error++;
                        }

                        if ((float)max2 / (float)min2 >= 1.13)
                        {
                            error++;
                        }
                        if ((float)max2 / ms2 >= 1.07)
                        {
                            error++;
                        }
                        if ((float)ms2 / (float)min2 >= 1.07)
                        {
                            error++;
                        }
                    }

                    // GOST     9,29 2,03 4,57 1,11 1,05 1,06
                    //                                                         // fillKey1
                    // GOSTM    7,11 2,00 3,56 1,11 1,05 1,05
                    //
                    // SHA3     10,8 2,03 5,33 1,10 1,05 1,05
                    //          7,88 1,97 4,00 1,10 1,05 1,05
                    //          9,29 2,03 4,57 1,11 1,05 1,06
                    //          7,67 2,16 3,56 1,12 1,06 1,06
                    //
                    // MH20     6,20 1,94 3,20 1,09 1,04 1,04
                    //          7,63 1,91 4,00 1,09 1,04 1,05
                    //          6,30 1,97 3,20 1,09 1,04 1,04
                    // MACHASHMOD
                    //
                    //
                    //  RC4     8.11 2.28 3.56 1.10 1.05 1.05
                    //          1500
                    //  RC4+    --
                    //          44

                    lock (sync)
                    {
                        if (error == 0)
                        {
                            Console.WriteLine("success ({0}) EC 0 {1:F}\t{2:F}\t{3:F}\t{4:F}\t{5:F}\t{6:F}", counterA, ((float)max / (float)min), ((float)max / (float)ms1), ((float)ms1 / (float)min), ((float)max2 / (float)min2), ((float)max2 / (float)ms2), ((float)ms2 / (float)min2));
                        }
                        else
                        {
                            Console.WriteLine("FAILED ({0}) EC {7} {1:F}\t{2:F}\t{3:F}\t{4:F}\t{5:F}\t{6:F}", counterA, ((float)max / (float)min), ((float)max / (float)ms1), ((float)ms1 / (float)min), ((float)max2 / (float)min2), ((float)max2 / (float)ms2), ((float)ms2 / (float)min2), error);
                            tgmgResultInt++;
                        }

                        tgmgSuccess--;
                        Monitor.Pulse(sync);

                        System.Windows.Media.MediaPlayer player = new System.Windows.Media.MediaPlayer();
                        player.Open(new Uri("Resources/siren.wav", UriKind.Relative));
                        player.Position = new TimeSpan(0);
                        player.Play();
                    }
                }
                );
            }
        }
Beispiel #22
0
        public void recordsToFile()
        {
            StringBuilder sb = new StringBuilder();

            foreach (var record in records)
            {
                sb.AppendLine(record.Value.mainTag);
                sb.AppendLine(record.Value.crypt);
                sb.AppendLine(record.Value.pwd);
                foreach (var tag in record.Value.tags)
                {
                    sb.AppendLine(tag);
                }

                sb.AppendLine();
            }

            var content = sb.ToString();

            sb.Clear();

            var curKey = key.getObjectValue();
            var sha    = new SHA3(content.Length);
            var bytes  = sha.multiCryptLZMA(new UTF32Encoding().GetBytes(content), curKey, null, 22, false, 0, SHA3.getHashCountForMultiHash() - 8);

            File.WriteAllBytes(fileName, bytes);

            BytesBuilder.ClearString(content);
            BytesBuilder.ToNull(curKey);
            BytesBuilder.ToNull(bytes);
        }
 public DigitalSignature(SHA3 sha3, RSA rsa)
 {
     Sha3     = sha3;
     RSAClass = rsa;
 }
Beispiel #24
0
        private static void duplexModTest(ref int errorFlag)
        {
            var keccak = new SHA3(0);

            byte[] a, b, c, e;
            a = new byte[72 * 3];
            b = new byte[72 * 3];

            e = keccak.getDuplexMod(a, b);
            c = keccak.getDuplexMod(a, b);
            if (!BytesBuilder.Compare(c, e))
            {
                goto error;
            }

            c = keccak.getDuplexMod(a, b, true);
            if (e[0] == c[0])
            {
                goto error;
            }

            b[b.Length - 1] = 1;
            c = keccak.getDuplexMod(a, b);
            int i;

            BytesBuilder.Compare(c, e, out i);
            if (i != 72 * 2)
            {
                goto error;
            }

            b[b.Length - 1]  = 0;
            b[b.Length - 72] = 1;
            c = keccak.getDuplexMod(a, b);
            BytesBuilder.Compare(c, e, out i);
            if (i != 72 * 2)
            {
                goto error;
            }

            b[b.Length - 72]  = 0;
            b[b.Length - 144] = 1;
            c = keccak.getDuplexMod(a, b);
            BytesBuilder.Compare(c, e, out i);
            if (i != 72 || e[72 * 2] == c[72 * 2])
            {
                goto error;
            }

            b[b.Length - 144] = 0;
            b[b.Length - 145] = 1;
            c = keccak.getDuplexMod(a, b);
            BytesBuilder.Compare(c, e, out i);
            if (i != 0 || e[72 * 2] == c[72 * 2] || e[72] == c[72])
            {
                goto error;
            }

            b[b.Length - 145] = 0;
            b[0] = 1;
            c    = keccak.getDuplexMod(a, b);
            BytesBuilder.Compare(c, e, out i);
            if (i != 0 || e[72 * 2] == c[72 * 2] || e[72] == c[72])
            {
                goto error;
            }

            return;

error:
            Interlocked.Increment(ref errorFlag);
            Console.WriteLine("duplexModTest is incorrect");
        }
Beispiel #25
0
        private static bool checkGammaByHash(SHA3 sha3)
        {
            byte[] keyAndMessage = new byte[72 * 8 - 1];
            byte[] key           = new byte[64];
            byte[] message       = new byte[72 * 7 - 1];

            var rnd = new Random(98732796);

            for (int i = 0; i < 64; i++)
            {
                keyAndMessage[i] = (byte)rnd.Next(0, 255);
            }

            keyAndMessage[64] = 0x01;
            keyAndMessage[71] = 0x80;

            for (int i = 72; i < keyAndMessage.Length; i++)
            {
                keyAndMessage[i] = (byte)rnd.Next(0, 255);
            }

            rnd = new Random(98732796);
            for (int i = 0; i < 64; i++)
            {
                key[i] = (byte)rnd.Next(0, 255);
            }
            for (int i = 0; i < message.Length; i++)
            {
                message[i] = (byte)rnd.Next(0, 255);
            }

            byte[] hash = sha3.getHash512(keyAndMessage);
            sha3.prepareGamma(key, message);
            byte[] gamma = sha3.getGamma(64, true);

            bool errorFlag = false;

            for (int i = 0; i < hash.Length; i++)
            {
                if (hash[i] != gamma[i])
                {
                    errorFlag = true;
                }
            }

            if (hash.Length != gamma.Length)
            {
                errorFlag = true;
            }

            if (errorFlag)
            {
                Console.WriteLine("Gamma and hash unequal, gamma is incorrect");
            }
            else
            {
                Console.WriteLine("Well. Gamma and hash equal, gamma is correct.");
            }

            return(!errorFlag);
        }
Beispiel #26
0
 public static byte[] SHA3512(byte[] Buffer) => SHA3.Create().ComputeHash(Buffer);
Beispiel #27
0
 public void ComputeHashRunsWithoutError()
 {
     SHA3.Create().ComputeHash(new byte[] { 0 });
     Assert.Pass();
 }
Beispiel #28
0
 public void CanCreateHashAlgorithmObject()
 {
     SHA3.Create();
     Assert.Pass();
 }
Beispiel #29
0
        static void Main(string[] args)
        {
            //Random8.test();
            var sha3 = new SHA3(8192);

            string dir;

            if (args.Length == 1)
            {
                dir = args[0];
            }
            else
            {
                dir = Directory.GetCurrentDirectory();
            }

            /*
             * var sc = new SmtpClient("localhost", 15025);
             * var mm = new MailMessage("*****@*****.**", "*****@*****.**", "test", DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString());
             * sc.Timeout = 5000;
             * sc.Credentials = new NetworkCredential("free", "pass");
             *
             * sc.Send(mm);
             * sc.Dispose();
             */
            /*
             * var ep80 = new IPEndPoint(IPAddress.Any, 80);
             * var loopback = new IPEndPoint(IPAddress.Loopback, 80);
             * var ep81 = new IPEndPoint(IPAddress.Any, 81);
             * var ep82 = new IPEndPoint(IPAddress.Any, 82);
             *
             *
             * var server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
             * server.DontFragment = true;
             * server.ReceiveTimeout = 1000;
             * // ~28 байт - IP и UDP заголовки; непонятно, как влияет недостаточный размер буфера на потерю сообщений. Впечатление, что сообщения могут и не влезать в буфер. В то же время при малом буфере (меньше размера одного пакета данных без UDP/IP-заголовка в одновременно посылаемых двух сообщениях) сообщения теряются
             * server.ReceiveBufferSize = 1024 * 1024;
             * server.ExclusiveAddressUse = true;
             * server.Bind(ep80);
             *
             * server.SendTo(new byte[1] {0}, loopback);
             *
             * UdpClientSendAndClose(ep81, loopback, "cnt\x00");
             * UdpClientSendAndClose(ep82, loopback, "cnt\x00");
             *
             * var begin = DateTime.Now.Ticks;
             *
             * do
             * {
             *  var regex = new Regex("[\\x00-\\x1F]", RegexOptions.Compiled | RegexOptions.Multiline);
             *  Console.WriteLine("available {0}", server.Available);
             *  try
             *  {
             *      var b = new byte[8 * 1024];
             *      EndPoint EP = new IPEndPoint(IPAddress.Loopback, 8080);
             *      var s = server.ReceiveFrom(b, ref EP);
             *
             *      Console.WriteLine("{0} from {2}: {1}", s, regex.Replace(UTF8Encoding.UTF8.GetString(b, 0, s), " ", -1), EP.ToString());
             *      Console.ReadLine();
             *  }
             *  catch (SocketException e)
             *  {
             *      Console.WriteLine("{0}", e.ErrorCode);
             *  }
             * }
             * while (server.Available > 0);
             *
             * Console.WriteLine("server {0} closed", server.LocalEndPoint.ToString());
             *
             * server.Close();
             * Console.ReadLine();
             */


            var keccak = new keccak.SHA3(1024 * 1024);

            File.WriteAllBytes("D:/bytesout.txt",
                               keccak.multiCryptLZMA(
                                   File.ReadAllBytes("D:/bytes.txt"),
                                   Encoding.GetEncoding("windows-1251").GetBytes("Метель ей пела песенку: спи ёлочка бай-бай"),
                                   null
                                   //Encoding.GetEncoding("windows-1251").GetBytes("Мороз снежком укутывал: смотри не замерзай"))
                                   )
                               );

            File.WriteAllBytes("D:/bytesdec.txt",
                               keccak.multiDecryptLZMA(File.ReadAllBytes("D:/bytesout.txt"), Encoding.GetEncoding("windows-1251").GetBytes("Метель ей пела песенку: спи ёлочка бай-бай"))
                               );

            var g      = new Gost28147Modified();
            var gamma3 = g.getGOSTGamma(keccak.getHash384(keccak.getHash512("Жуткий ключ")), keccak.getHash256("Синхропосылка"), Gost28147Modified.ESbox_A, 1024 * 1024);

            File.WriteAllBytes("D:/bytegamma28147.txt", gamma3);

            /*var g = new Gost28147Modified();
             * g.prepareGamma(UTF8Encoding.UTF8.GetBytes("Но вот багряною рукою Заря от утренних долин"), UTF8Encoding.UTF8.GetBytes("Выводит с солнцем"), Gost28147Modified.CryptoProA, Gost28147Modified.CryptoProA);
             * File.WriteAllBytes("D:/bytesout28147.txt", g.getGamma(1024*1024));*/
        }
Beispiel #30
0
        protected unsafe void processBlocksForGamma2(int SL, byte[] block, byte[] outblock, byte[] k, byte *[] b, bool permutation, int GOST5)
        {
            if (b.Length != 6 || k.Length != 5)
            {
                throw new ArgumentException("processBlocksForGamma2 b.Length != 6 || k.Length != 5");
            }

            long works = 0;
            var  sync  = new Object();

            SHA3 sha = null;

            if (GOST5 >= 13)
            {
                shaPP.randomize(block);

                sha = new SHA3(block.Length);
                sha.getDuplex(block, false, -1, false);
            }

            if (GOST5 < 13)
            {
                if ((SL & 7) > 0)
                {
                    throw new ArgumentException("processBlocksForGamma2 SL & 7 > 0");
                }
            }
            else
            {
                if ((SL & 15) > 0)
                {
                    throw new ArgumentException("processBlocksForGamma2 SL & 15 > 0: " + SL);
                }
            }

            byte[] Na    = (GOST5 >= 13) ? shaPP.nextBytes64() : null; //bytesToint(block, i);
            int    nk2   = 0;
            int    bStep = (GOST5 >= 13) ? 16 : 8;

            for (int i = 0, j = 0; i < SL; i += bStep, j++)
            {
                if (i + bStep > SL)
                {
                    throw new ArgumentOutOfRangeException("i + bStep >= SL");
                }

                if (GOST5 < 13)
                {
                    int N = bytesToint(block, i);
                    for (int i1 = 0; i1 < b.Length; i1++)
                    {
                        for (int i2 = i1 + 1; i2 < b.Length; i2++)
                        {
                            if ((N & 1) > 0)
                            {
                                byte *t = b[i1];
                                b[i1] = b[i2];
                                b[i2] = t;
                            }
                            N >>= 1;
                        }
                    }

                    N = bytesToint(block, i + 4);
                    for (int i1 = 0; i1 < k.Length; i1++)
                    {
                        for (int i2 = i1 + 1; i2 < k.Length; i2++)
                        {
                            if ((N & 1) > 0)
                            {
                                byte t = k[i1];
                                k[i1] = k[i2];
                                k[i2] = t;
                            }

                            N >>= 1;
                        }
                    }
                }
                else
                {
                    if (i > SL - 15)
                    {
                        break;
                    }

                    byte _L = (byte)(j & 7);

                    if (nk2 > Na.Length - 8)
                    {
                        Na  = shaPP.nextBytes64();
                        nk2 = 0;
                    }

                    for (int nk2i = nk2; nk2i < nk2 + 8; nk2i++)
                    {
                        pbfg2Perm(k, ka, (Na[nk2i] & 7) ^ _L);
                        Na[nk2i] >>= 3;
                        pbfg2PPerm(b, ba, (Na[nk2i] & 7) ^ _L);
                    }
                    nk2 += 8;
                }

                var _i = i;
                var _j = j & 1;
                var k0 = k[0];
                var k1 = k[1];
                var k2 = k[2];
                var k3 = k[3];
                var k4 = GOST5 >= 13 ? k[4] : 0;
                var b0 = b[0];
                var b1 = b[1];
                var b2 = b[2];
                var b3 = b[3];
                var b4 = b[4];
                var sh = GOST5 >= 13 ? sha.Clone() : null;

                Interlocked.Increment(ref works);
                ThreadPool.QueueUserWorkItem
                (
                    delegate
                {
                    try
                    {
                        if (GOST5 >= 13)
                        {
                            var tmp0 = new byte[16];
                            var tmp1 = new byte[16];
                            var tmp2 = new byte[16];

                            BytesBuilder.CopyTo(block, tmp0, 0, -1, _i);
                            BytesBuilder.CopyTo(tmp0, tmp1);
                            BytesBuilder.CopyTo(tmp0, tmp2);
                            BytesBuilder.ToNull(tmp0);


                            tmp1 = sh.getDuplex(tmp2, true, 16, true, 16);
                            ProcessBlock(tmp1, 0, tmp2, 0, workingKey[k0], b4, true);
                            ProcessBlock(tmp1, 8, tmp2, 8, workingKey[k0], b0, true);
                            BytesBuilder.ToNull(tmp1);

                            //sh.getDuplex(bytes1, true, 0, false);
                            tmp1 = sh.getDuplex(tmp2, true, 16, true, 16);
                            ProcessBlock(tmp1, 0, tmp2, 0, workingKey[k1], b0, true);
                            ProcessBlock(tmp1, 8, tmp2, 8, workingKey[k1], b1, true);
                            BytesBuilder.ToNull(tmp1);

                            tmp1 = sh.getDuplex(tmp2, true, 16, true, 16);
                            ProcessBlock(tmp1, 0, tmp2, 0, workingKey[k2], b1, true);
                            ProcessBlock(tmp1, 8, tmp2, 8, workingKey[k2], b2, true);
                            BytesBuilder.ToNull(tmp1);

                            tmp1 = sh.getDuplex(tmp2, true, 16, true, 16);
                            ProcessBlock(tmp1, 0, tmp2, 0, workingKey[k3], b2, true);
                            ProcessBlock(tmp1, 8, tmp2, 8, workingKey[k3], b3, true);
                            BytesBuilder.ToNull(tmp1);

                            tmp1 = sh.getDuplex(tmp2, true, 16, true, 16);
                            ProcessBlock(tmp1, 0, tmp2, 0, workingKey[k4], b3, true);
                            ProcessBlock(tmp1, 8, tmp2, 8, workingKey[k4], b4, true);
                            BytesBuilder.ToNull(tmp1);

                            BytesBuilder.CopyTo(tmp2, outblock, _i);
                            BytesBuilder.ToNull(tmp2);
                        }
                        else
                        if (_j > 0)
                        {
                            ProcessBlock(block, _i, outblock, _i, workingKey[k3], b0, true);
                            ProcessBlock(outblock, _i, block, _i, workingKey[k1], b1, false);
                            ProcessBlock(block, _i, outblock, _i, workingKey[k0], b2, true);
                            ProcessBlock(outblock, _i, block, _i, workingKey[k2], b3, false);
                            ProcessBlock(block, _i, outblock, _i, workingKey[k3], b4, true);
                        }
                        else
                        {
                            ProcessBlock(block, _i, outblock, _i, workingKey[k0], b4, true);
                            ProcessBlock(outblock, _i, block, _i, workingKey[k3], b3, false);
                            ProcessBlock(block, _i, outblock, _i, workingKey[k2], b2, true);
                            ProcessBlock(outblock, _i, block, _i, workingKey[k1], b1, false);
                            ProcessBlock(block, _i, outblock, _i, workingKey[k0], b0, true);
                        }
                    }
                    finally
                    {
                        lock (sync)
                        {
                            Interlocked.Decrement(ref works);
                            Monitor.Pulse(sync);
                        }
                    }
                }
                );
            }

            lock (sync)
                while (Interlocked.Read(ref works) > 0)
                {
                    Monitor.Wait(sync);
                }

            if (permutation)
            {
                BlocksPermutation(SL, outblock, block, k, b, GOST5);
            }
        }