Додаток 5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Numerics;
using System.Security.Cryptography;
using System.Globalization;
namespace DSA
{
class Program
{
static void Main(string[] args)
{
//string M = "N";
//byte[] hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(M));
BigInteger m = new BigInteger(5);
for (BigInteger q = BigInteger.Pow(2, 8) ; q < BigInteger.Pow(2, 9); q++)
{
if(ferma(q))
for (BigInteger n = BigInteger.Pow(2, 8); n < BigInteger.Pow(2, 9); n++)
{
BigInteger p = q * n + 1;
if (ferma(p))
{
BigInteger g = pows(Random(),n, p);
BigInteger x = Random();
while(x<0)
x = Random();
//p = 23;
//q = 11;
//x = 7;
//g = 4;
//m = 9;
BigInteger y = pows(g, x, p);
BigInteger k = Random();
while (k < 0)
k = Random();
//k = 3;
BigInteger r = (pows(g,k,p))%q;
BigInteger s = ((m+x*r)*pows(k, q-2, q))%q;
BigInteger w = pows((pows(s, q - 2, q)),1,q);
BigInteger u1 = pows(m * w, 1, q);
BigInteger u2 = pows(r * w, 1, q);
BigInteger v = ((BigInteger.Pow(g, (int)u1) * BigInteger.Pow(y, (int)u2)) % p) % q;
Console.WriteLine("q= " + q.ToString());
Console.WriteLine("p= " + p.ToString());
Console.WriteLine("g= " + g.ToString());
Console.WriteLine("x= " + x.ToString());
Console.WriteLine("y= " + y.ToString());
Console.WriteLine("k= " + k.ToString());
Console.WriteLine("m= " + m.ToString());
Console.WriteLine("r= " + r.ToString());
Console.WriteLine("s= " + s.ToString());
Console.WriteLine("w= " + w.ToString());
Console.WriteLine("u1= " + u1.ToString());
Console.WriteLine("u2= " + u2.ToString());
Console.WriteLine("v= " + v.ToString());
Console.WriteLine("r=v");
Console.WriteLine(r + "=" + v);
Console.ReadKey();
}
}
}
}
static BigInteger Invers(BigInteger a, BigInteger n)
{
BigInteger result = 1;
for (int i = 1; i <= a; ++i)
if (result * a % n == 1)
return result;
return 0;
}
static bool ferma(BigInteger x){
if(x == 2)
return true;
for(int i=0;i<100;i++){
BigInteger a = (new Random().Next() % (x - 2)) + 2;
if (gcd(a, x) != 1)
return false;
if( pows(a, x-1, x) != 1)
return false;
}
return true;
}
static BigInteger gcd(BigInteger a, BigInteger b){
if(b==0)
return a;
return gcd(b, a%b);
}
static BigInteger mul(BigInteger a, BigInteger b, BigInteger m){
if(b==1)
return a;
if(b%2==0){
BigInteger t = mul(a, b/2, m);
return (2 * t) % m;
}
return (mul(a, b-1, m) + a) % m;
}
static BigInteger pows(BigInteger a, BigInteger b, BigInteger m){
if(b==0)
return 1;
if(b%2==0){
BigInteger t = pows(a, b / 2, m);
return mul(t , t, m) % m;
}
return ( mul(pows(a, b-1, m) , a, m)) % m;
}
static BigInteger Random()
{
//var rng = new RNGCryptoServiceProvider();
//byte[] bytes = new byte[1];
//rng.GetBytes(bytes);
//BigInteger h = new BigInteger(bytes);
return new Random().Next(1, 8);
}
}
}