alice_killer

a

Dec 1st, 2021
1,031
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.     using System;
  2.     using System.Collections.Generic;
  3.     using System.ComponentModel;
  4.     using System.Data;
  5.     using System.Drawing;
  6.     using System.Linq;
  7.     using System.Text;
  8.     using System.Threading.Tasks;
  9.     using System.Windows.Forms;
  10.     using System.Numerics;
  11.  
  12.     namespace cripto
  13.     {
  14.         public partial class Form1 : Form
  15.         {
  16.             public Form1()
  17.             {
  18.                 InitializeComponent();
  19.             }
  20.  
  21.             // function for GCD
  22.             static int GCD(int a, int b)
  23.             {
  24.  
  25.                 if (b == 0)
  26.                     return a;
  27.  
  28.                 return GCD(b, a % b);
  29.             }
  30.  
  31.  
  32.  
  33.  
  34.             public bool prime_number(BigInteger number)
  35.             {
  36.                 bool simple = true;
  37.                 for (int i = 2; i <= number / 2; i++)
  38.                 {
  39.                     if (number % i == 0)
  40.                     {
  41.                         simple = false;
  42.                         break;
  43.                     }
  44.                 }
  45.                 if (simple)
  46.                 {
  47.                     return true;
  48.                 }
  49.                 else
  50.                 {
  51.                     return false;
  52.                 }
  53.  
  54.             }
  55.  
  56.  
  57.  
  58.  
  59.             /* int x = 12345; //14147
  60.                 BigInteger p = 26437;
  61.                 int U = 5465;
  62.                 BigInteger hash = 11111;
  63.                 BigInteger a = 3;
  64.                 int gamma = 2203;
  65.                 int A = 26437, N = 12;
  66.                 BigInteger y = (BigInteger.Pow(a, x)) % p;
  67.                 BigInteger z = (hash * BigInteger.Pow(a, U) % p);
  68.                 BigInteger Z = BigInteger.Pow(a, U) % p;
  69.                 int zint = (int)z;
  70.                 int Zint = (int)Z;
  71.                 BigInteger k = (U * Z / (x - z)) % gamma;
  72.                 BigInteger g = (x - (Zint / zint)) % gamma;
  73.             */
  74.             public BigInteger getRandom(int length)
  75.             {
  76.                 Random random = new Random();
  77.                 byte[] data = new byte[length];
  78.                 random.NextBytes(data);
  79.                 return new BigInteger(data);
  80.             }
  81.  
  82.             private void button1_Click(object sender, EventArgs e)
  83.             {
  84.                     //BigInteger rbg = new RandomBigInteger();
  85.                     BigInteger gamma = 0;
  86.                     BigInteger a = 0;
  87.                     BigInteger qq = 0;
  88.                     BigInteger p = BigInteger.Parse(textBox1.Text);
  89.                     BigInteger x = BigInteger.Parse(textBox5.Text);
  90.                     if (prime_number(p))
  91.                     {
  92.                         BigInteger U = BigInteger.Parse(textBox2.Text); ;
  93.                                    
  94.                         BigInteger h = BigInteger.Parse(textBox3.Text); ;
  95.                    
  96.  
  97.  
  98.                         //Подбор Gamma
  99.                         for (BigInteger i = 1; i <= (p - 1); i++)
  100.                         {
  101.                             gamma = ((i / 4) * 4) + 3;
  102.                             if (i == gamma && prime_number(gamma) && (p - 1) % gamma == 0)
  103.                             {
  104.                                 textBox4.Text = gamma.ToString();
  105.                                 break;
  106.                             }
  107.                         }
  108.  
  109.  
  110.  
  111.  
  112.                     //Подбор A
  113.                     for (BigInteger i = 2; i < p; i++)
  114.                     {
  115.                             a = BigInteger.ModPow(i, (p - 1) / gamma, p);
  116.                             if (a != 1 && BigInteger.ModPow(a, gamma, p) == 1)
  117.                             {
  118.                                 textBox6.Text = a.ToString();
  119.                                 break;
  120.                             }
  121.                     }
  122.                         //Подбор q
  123.                         for (BigInteger j = 1 ; j < p - 1; j++)
  124.                         {
  125.                             qq = j;
  126.                             if (qq % p ==  a % p)
  127.                             {
  128.                                 textBox7.Text = qq.ToString();
  129.                                 break;
  130.                             }
  131.                         }
  132.                         BigInteger z =  h * BigInteger.ModPow(a, U, p);
  133.  
  134.  
  135.  
  136.  
  137.                         BigInteger k = ((U * z) / (x - z)) % gamma;
  138.  
  139.                         if (k < 0)
  140.                         {
  141.                             k = k + gamma;
  142.                         }
  143.                         BigInteger q = p;
  144.                         BigInteger g = ((x-z) / z) % gamma;
  145.                         BigInteger s = BigInteger.ModPow(a, g, p);
  146.                    
  147.                         BigInteger step = (h * BigInteger.Pow(s, (int)k)) % p;
  148.                         BigInteger check1 = BigInteger.Pow(s, (int)step)* BigInteger.Pow(a, (int)x) % p % qq;
  149.                         BigInteger check2 = BigInteger.Pow(a, (int)x) % p % qq;
  150.                         listBox1.Items.Clear();
  151.                         listBox1.Items.Add("Исходные данные:");
  152.                         listBox1.Items.Add("p = " + p);
  153.                         listBox1.Items.Add("x = " + x);
  154.                         listBox1.Items.Add("U = " + U);
  155.                         listBox1.Items.Add("hash = " + h);
  156.                         listBox1.Items.Add("gamma = " + gamma);
  157.                         listBox1.Items.Add("a = " + a);
  158.                         listBox1.Items.Add("Результат вычислений:");
  159.                         listBox1.Items.Add("z = " + z);
  160.                         listBox1.Items.Add("k = " + k);
  161.                         listBox1.Items.Add("g = " + g);
  162.                         listBox1.Items.Add("S = " + s);
  163.                         listBox1.Items.Add("q = " + qq);
  164.                         listBox1.Items.Add("Левое значение сравнения = " + check1);
  165.                         listBox1.Items.Add("Правое значение сравнения = " + check2);
  166.                     }
  167.                     else
  168.                     {
  169.                         MessageBox.Show("P не простое число, введите другое");
  170.                     }
  171.            
  172.  
  173.                 /*
  174.                 int x = 12345; //14147
  175.                 BigInteger p = 26437;
  176.                 int U = 5465;
  177.                 BigInteger hash = 11111;
  178.                 BigInteger a = 3;
  179.                 int gamma = 2203;
  180.                 int A = 26437, N = 12;
  181.                 BigInteger y = (BigInteger.Pow(a, x)) % p;
  182.                 BigInteger z = (hash * BigInteger.Pow(a, U) % p);
  183.                 */
  184.            
  185.             }
  186.  
  187.             private void textBox7_TextChanged(object sender, EventArgs e)
  188.             {
  189.  
  190.             }
  191.         }
  192.     }
  193.  
RAW Paste Data