private BigInteger GenerateA(BigInteger n) { Random random = new Random(); BigInteger a = random.Next(1, (int)n), nod = GCD.GetNOD(a, n); while (nod != 1) { a = random.Next(1, (int)n); nod = GCD.GetNOD(a, n); } return(a); }
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)); }