private async void WorkAsync() { IsNoActionRunning = false; try { #region Checks //Check whether file id is int if (!int.TryParse(ChosenFileId, out int FileId)) { IsCompleted = false; StateText = "Wrong File id!"; return; } //Check whether file id is correct if ((FileId >= FilesLoaded.Count()) || (FileId < 0)) { IsCompleted = false; StateText = "Wrong File id!"; return; } if (string.IsNullOrEmpty(ChosenAction)) { return; } string FilePath = string.Empty; //Load file path foreach (var item in FilesLoaded) { if (item.Id == FileId) { FilePath = item.FileRealName; break; } } //if file id points to empty record if (string.IsNullOrWhiteSpace(FilePath)) { IsCompleted = false; StateText = "File id is wrong."; return; } // if file was deleted after loading if (!File.Exists(FilePath)) { IsCompleted = false; StateText = "File doesnt exist."; return; } #endregion #region Rabin //Rabin if (ChosenCipher == CiphersList[0]) { BigInteger p = 0; BigInteger q = 0; //Encrypt if (ChosenAction == ActionsList[0]) { //Check everything strictly because we are waiting data from user // and not generating it if (!IsKeysAutoGenerating) { #region data parsing if (!BigInteger.TryParse(SecretKeyParam1, out p)) { StateText = "Wrong first secret key parameter ."; IsCompleted = false; return; } if (!BigInteger.TryParse(SecretKeyParam2, out q)) { StateText = "Wrong second secret key parameter ."; IsCompleted = false; return; } if ((!p.CheckIfPrime()) || (!q.CheckIfPrime())) { StateText = "One of two numbers was not prime"; IsCompleted = false; return; } if ((p % 4 != 3) || (q % 4 != 3)) { StateText = "p and q mod 4 must be equal to 3."; return; } if (p == q) { StateText = "Secret key values must differ."; IsCompleted = false; return; } #endregion } //if user've chosen to generate keys automatically, generate them now. if (IsKeysAutoGenerating) { #region Key generation p = RandomNumbersGenerator.GenerateBlumPrime(defaultKeyLength); q = RandomNumbersGenerator.GenerateBlumPrime(defaultKeyLength); if (p < 0) { p = -p; } if (q < 0) { q = -q; } CredentialsText = "p : " + p.ToString() + Environment.NewLine + "q: " + q.ToString() + Environment.NewLine + "Public key is: " + (p * q).ToString(); #endregion } bool result = false; result = RabinInstance.Initialize(p, q); if (!result) { StateText = "Check key and try again."; IsCompleted = false; return; } await Task.Run(() => result = RabinInstance.Encrypt(p, q, FilePath)); if (!result) { StateText = "Check key and try again."; IsCompleted = false; return; } } //Decrypt else { #region data parsing if (!BigInteger.TryParse(SecretKeyParam1, out p)) { StateText = "Wrong first secret key parameter ."; IsCompleted = false; return; } if (!BigInteger.TryParse(SecretKeyParam2, out q)) { StateText = "Wrong second secret key parameter ."; IsCompleted = false; return; } if ((p % 4 != 3) || (q % 4 != 3)) { StateText = "p and q mod 4 must be equal to 3."; return; } if (p == q) { StateText = "Secret key values must differ."; IsCompleted = false; return; } bool result = false; result = RabinInstance.Initialize(p, q); if (!result) { StateText = "Check key and try again."; IsCompleted = false; return; } #endregion result = false; await Task.Run(() => result = RabinInstance.Decrypt(p, q, FilePath)); if (!result) { StateText = "Check data you are decrypting and try again."; IsCompleted = false; return; } } } #endregion #region Yarmolik - Rabin //Yarmolik - Rabin else if (ChosenCipher == CiphersList[1]) { //Encrypt if (ChosenAction == ActionsList[0]) { if (!short.TryParse(PublicKeyParam1, out var publicKey)) { #region Checks // if public key was not provided, try parse private keys if (!short.TryParse(SecretKeyParam1, out var p)) { StateText = "Wrong first secret param."; IsCompleted = false; return; } if (!short.TryParse(SecretKeyParam2, out var q)) { StateText = "Wrong second secret param."; IsCompleted = false; return; } if ((!p.CheckIfPrime()) || (!q.CheckIfPrime())) { StateText = "One of two numbers was not prime"; IsCompleted = false; return; } if ((p % 4 != 3) || (q % 4 != 3)) { StateText = "p and q mod 4 must be equal to 3."; IsCompleted = false; return; } if (p * q < Math.Pow(2, 8)) { StateText = "p * q must be more than 1 byte."; IsCompleted = false; return; } if (!short.TryParse(PublicKeyParam2, out var caesarCoeff)) { StateText = "Wrong caesar coefficient."; IsCompleted = false; return; } if (caesarCoeff >= p * q) { StateText = "Caesar coefficient must be less than public key."; IsCompleted = false; return; } if (p == q) { StateText = "Secret key values must differ."; IsCompleted = false; return; } #endregion YarmolikRabinInstance.Encrypt(p, q, caesarCoeff, FilePath); } else { // if public key was provided #region Checks if (!short.TryParse(PublicKeyParam2, out var caesarCoeff)) { StateText = "Wrong caesar coefficient."; IsCompleted = false; return; } if (caesarCoeff >= publicKey) { StateText = "Caesar coefficient must be less than public key."; IsCompleted = false; return; } if ((IsUnicodeSupported) && (publicKey < russianMaxUnicodeIndx)) { StateText = $"To support unicode symbols, provide a public key larger than {russianMaxUnicodeIndx}"; IsCompleted = false; return; } if (publicKey < Math.Pow(2, 8)) { StateText = $"Public key should be more than 1 byte"; IsCompleted = false; return; } #endregion YarmolikRabinInstance.Encrypt(publicKey, caesarCoeff, FilePath); } } //Decrypt else { #region Checks if (!short.TryParse(SecretKeyParam1, out var p)) { StateText = "Wrong first secret param."; IsCompleted = false; return; } if (!short.TryParse(SecretKeyParam2, out var q)) { StateText = "Wrong second secret param."; IsCompleted = false; return; } if ((!p.CheckIfPrime()) || (!q.CheckIfPrime())) { StateText = "One of two numbers was not prime"; IsCompleted = false; return; } if ((p % 4 != 3) || (q % 4 != 3)) { StateText = "p and q mod 4 must be equal to 3."; IsCompleted = false; return; } if (p * q < Math.Pow(2, 8)) { StateText = "p * q must be more than 1 byte."; IsCompleted = false; return; } if (!short.TryParse(PublicKeyParam2, out var caesarCoeff)) { StateText = "Wrong caesar coefficient."; IsCompleted = false; return; } if (caesarCoeff >= p * q) { StateText = "Caesar coefficient must be less than public key."; IsCompleted = false; return; } if (p == q) { StateText = "Secret key values must differ."; IsCompleted = false; return; } #endregion await Task.Run(() => YarmolikRabinInstance.Decrypt(p, q, caesarCoeff, FilePath)); } } #endregion StateText = "Action completed."; IsCompleted = true; } catch (ArgumentException ex) { StateText = ex.Message; IsCompleted = false; } catch (OutOfMemoryException) { StateText = "Memory limit was exceeded."; IsCompleted = false; } finally { IsNoActionRunning = true; } }