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)); }
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); } }
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); }
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); }
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); }
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; } }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
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); }
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"); }
private string ComputeHash(SHA3 algorithm, string plainText) { return(Hash .FromBytes(algorithm.ComputeHash(plainText.ToByteArray())) .ToString()); }
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(); }
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(); }
/* * 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("dm1gZGxLOObGEsQBBg09Nuhi1dnMdzue40B2cvfvff10nVbQQ7JwSvhtZfiJbnFoCG492Us7jPAMnWvYl5RYCsQSUS5TIZ8+7p3chQ7/SpclDR7MGHqCl6T/6LN7ikfVngdI1vZlCrQHDNB4yBynQwRLlMk0puvedDKJLOOcfu40R6/QezEIW3WpPU9qeVYzgwvhbfRrc6wP7WxWMR09Nh97ciY2io+FZ0fsQpCno25ptAIH1dzb1w2DbVLaqF03qz873LLBaHyNdH+4PN92sG9iJ+pOmAQGF/+Jq+TtOdO2TwnAv33rspm6aFpDaKQh4MpNPIhOZct8OhFIQs5r/L5kTNL+McswrZZXPUrWddmrETjMh7ZZ5SeudyfUvJT1MLOUO/K6b6YtGb0pq9VZ4W3K0vhlQBxzSh6ghoFzWCYkG+yNj6vF5iyBjW9R2PCy03lHNbfIy4X8LzAuMjCfxE4Rq7XiT4JcYRHRYXX+NDN2hQtaerzor4FzHJZGyvabz4Ob9+7lCHffL/DysHW660VcmiyZzoxsdM18/JnebllOmKBqJwR/GSci8hTuXca8eZ4TDnL/wJOPA5UOB8yqQ7uGFnfjHIY2Jq7Pyvfd9DingIMe0lkQMG+r6lPVjzxxwjyQ/xXXI7EYyAsD0HllrlcoACwWbLMLnQ3pe36Nl8RbEY3eftn9I7HwdtgfAsmTaxc7NAl2yetAHdf/iUZBUJ6mjKm8/2LeQZI1bxVVygVUZsTEDW1QZrXXEooIeTepxJaZSI8EMKLI9QTu3AEydto35MsD6DKN17jZnWoNXpC/USddnas25ZgtOZrNepPpSHzm+yociIf8sh8R6GwJjueapXP6HfvYQD+8rVOeVwDnjIKEZU2sV/PpQqrm7JgfT0MqehhxCSm8hvooCqW6WfNnCvUVFDRC4F/KD7douOooh3cGVjt2i2NZASBTSWZvXqimf9/MVDgP61L3JbpBlh7sWtBj4kL5PRoIxqqqiXp53gQumuV6Qtw8f0ryMQwrfLoXkFbMBcOaAv8nlBVpJzVBNnolJ1K7WxwTTWk51+cdN2oIazHGvgl9ccKgVBqZsg7dtlycu45mi/auhVNoAAVcw+wIwhH2jGmB79bnus7s+bDIdoW3+5oIPrb+bwJ8Hcz9nlQxjyifMuVOpNxH7gosBYBiqtGI5UI0SFygjMS7VLjICEJ025pNMypkxTVINbbBY2ouUoEU0K9X5OdM5b61Q+hB10h3+QtB44BlOW0jAVLVsVv0Y8BbZ8fkbZBdnv/aewwdEW7fsNA8bNqNAa212Ep/4m9n+f+LLOo1MXo4sGP8m0NqorIVrj3D3As4pF60l9Sc724P0t+y+yTuiqxG/20aHIxITSLY7St2AoucD7kKzq+ELAZ91uH4wQM/xfzg4SouaLXL/OU11ScmphAS0t5oK/Q6qW+b0Cz/6ucute1dYFoJ9eMw8zkRcUwEIk4nARBRPo+8Z1jDf0dyb/+NJHhvZHcY+WjaXBliN456SdXJjqZxAUh8qFMkoDoczAlFwBeZVvSQQWLxuCZigvvuFGtNJXt26TrhHSbUpK9SH9CthzK30kUMWQJIwXdImGjaN6NgU/TN23QEtjE2/7H2Cu6iheeV5w/5ampxoH4NXL0nAt+ZxI8z1pTYwiGHfXhcVS2AHktmBykTauJx1PpomAQODDq5kYat3+amO7knkoVWibRdIXEWzCf5x/5kusom2IY7j3foxnvrixRoLJmgVWgM07gb44iE3vAFvvJyYRWdikLyQMvyImu3+9Me5sungowXt96PS/IlNELAOWjKf3Il4eyuAGe6O2nbphOT+n22ftSIWsRiyXfbTRMmJcPg4ADu+wPej06nSjIa9mu28SYg9JtEZcyGV4LBnNRayuqBKqKwFS2NGl+yjEPN54LRom/dQd4YFzww9pdlU7NqF+D2123wtpDEZmOEeeg8YqDwSgeH2UYpXBkpv9gkqGinZ9MpZGJ3l8PClppQegEqg9lMxbxFEBoXxlmNA/P3vUCbGDc1gbOuDvhlYmeqddZwHAW6b1wqO93/E9SO7Isi/ngVlgEq5F9jQRPo/MrQdvAlJ4d9+Gq0ANqSTVU7mO08tmVhpTaVf0kxTs3pmfcPFvBsmg+7QXltsNl3xtHcfoPa0+RNC8UJO8WVVck+hJlproNtr/KcUCkfWY/CkkorBaCLrD9Wo0WTy2O3wCfJrcLLT8Rdkl4nk6B3FncfdBWfRyjMpocbxaVieCO5sFnCibTZIuYxxVRsd+NBBTBXifrVSkrYrHBidWgnnyMvNuRyTNodLO1AWEcX9QK2l2xlJPlvAFkQhYAv4ef+XDttRf09MjmJP44k7tIolOV3gGTFGgRToKXk5nlSXvXy8q0R42YOjhvzvOQ7AeYoI/bQ38p9cK3qu/5Di4Spjqn+B+oBoXai74LgQEmA5BdgyVC/hfdhfv47AclCoHbXIWZ+HDIUpRtQzIY9YoHtZaic/ern68niLVe0sOzeX7c2LrUsBIf6QhwZIlU5GSuoSl5m+zCGh6p3xflwd/gNd08QlIgmbE4G6aOqYB09uDjGho7VfY3Gy8qjzMjCzTSdeRc/ahbreVZUBGMqhS2TgdBoJu5u1+gnY5B320b44Ni61RFn1fKCaHMbYCJ4xusy8VzkcXmJFPqgY+0unSM3GXg5RQUx0DhOb+sdy7/7ocf+TpmOJFYSQYPsqsuqrfj27xDWiKjfRV/YyRC2BOsdItZn"), 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(); } } ); } }
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; }
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"); }
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); }
public static byte[] SHA3512(byte[] Buffer) => SHA3.Create().ComputeHash(Buffer);
public void ComputeHashRunsWithoutError() { SHA3.Create().ComputeHash(new byte[] { 0 }); Assert.Pass(); }
public void CanCreateHashAlgorithmObject() { SHA3.Create(); Assert.Pass(); }
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));*/ }
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); } }