Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
50
Добавлен:
31.01.2021
Размер:
46.52 Кб
Скачать

Додаток 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);

}

}

}