public string Decrypt(BigInteger[] encryptedText) { byte[] decryptedText = new byte[encryptedText.Length]; for (int i = 0; i < encryptedText.Length; i++) { StringBuilder symbol = new StringBuilder("00000000"); BigInteger s = BigInteger.ModPow(BigInteger.Multiply(encryptedText[i], GCD.ModInverse(a, n)), 1, n); BigInteger diff = s; while (diff > 0) { BigInteger[] lessThenDiff = d.Where(el => el <= diff).ToArray(); if (lessThenDiff.Length > 0) { BigInteger maxItem = lessThenDiff.Max(); diff -= maxItem; if (diff >= 0) { symbol.Remove(Array.IndexOf(d, maxItem), 1); symbol.Insert(Array.IndexOf(d, maxItem), "1"); } } else { break; } } decryptedText[i] = Convert.ToByte(symbol.ToString(), 2); } return(Encoding.ASCII.GetString(decryptedText)); }