private BigInteger GenerateCoprimeNumber(BigInteger coprime) { BigInteger number = random.Next(2, (int)coprime - 1), nod = GCD.GetNOD(number, coprime); while (nod != 1) { number = random.Next(2, (int)coprime - 1); nod = GCD.GetNOD(number, coprime); } return(number); }
public BigInteger[,] CreateDigitalSign(string text) { using (MD5 md5Hash = MD5.Create()) { hash = MD5Hash.GetMd5Hash(md5Hash, text); } byte[] bytes = Encoding.ASCII.GetBytes(hash); BigInteger[,] digitalSign = new BigInteger[bytes.Length, 2]; for (int i = 0; i < bytes.Length; i++) { do { BigInteger k = random.Next(2, (int)p - 2); while (GCD.GetNOD(k, p - 1) != 1) { k = random.Next(2, (int)p - 2); } digitalSign[i, 0] = BigInteger.ModPow(g, k, p); BigInteger temp = BigInteger.Multiply(BigInteger.Subtract(bytes[i], BigInteger.Multiply(x, digitalSign[i, 0])), GCD.ModInverse(k, p - 1)); digitalSign[i, 1] = temp < 0 ? (p - 1) - BigInteger.ModPow(BigInteger.Negate(temp), 1, p - 1) : BigInteger.ModPow(temp, 1, p - 1); } while (digitalSign[i, 1] == 0); } return(digitalSign); }