Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.32 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Org.BouncyCastle.Math;
  7.  
  8. namespace secret
  9. {
  10.     class Program
  11.     {
  12.         static void Main(string[] args)
  13.         {
  14.             Console.WriteLine("Bartłomiej Wolnik, gr.A");
  15.             string secretString = getRandomSecretString(secretSize());
  16.             Console.WriteLine("Sekret: " + secretString);
  17.             Console.WriteLine("--------");
  18.             int[] senatorNumbers = { 6, 4, 10 };
  19.             int[] requiredAcceptances = { 3, 3, 6 };
  20.             BigInteger[] regionSecrets = new BigInteger[3];
  21.  
  22.             for (int i = 0; i < 3; i++)
  23.             {
  24.                 string regionSecretString = secretString.Substring(i * (secretString.Length / 3), secretString.Length / 3);
  25.                 regionSecrets[i] = new BigInteger(regionSecretString);
  26.             }
  27.  
  28.             for (int i = 0; i < 3; i++)
  29.             {
  30.                 BigInteger secret = regionSecrets[i];
  31.                 BigInteger prime = secret.NextProbablePrime();
  32.                 Console.WriteLine();
  33.                 Console.WriteLine("Sekret dla regionu " + i + ":");
  34.                 Console.WriteLine(secret);
  35.                 Console.WriteLine("prime: " + prime);
  36.                 BigInteger[] elements = new BigInteger[requiredAcceptances[i] - 1];
  37.                 BigInteger[] shares = new BigInteger[senatorNumbers[i]];
  38.  
  39.                 for (int j = 0; j < requiredAcceptances[i] - 1; j++)
  40.                 {
  41.                     BigInteger randomBigInteger;
  42.                     do
  43.                     {
  44.                         randomBigInteger = new BigInteger(getRandomSecretString(secretSize()/3));
  45.                     } while (randomBigInteger.CompareTo(secret) > 0);
  46.                     elements[j] = randomBigInteger;
  47.                 }
  48.                 Console.WriteLine("Udziały: ");
  49.                 for (int x = 1; x <= senatorNumbers[i]; x++)
  50.                 {
  51.                     BigInteger W = new BigInteger("0");
  52.                     for (int power = 1; power < requiredAcceptances[i]; power++)
  53.                     {
  54.                         BigInteger xBigInt = new BigInteger(x.ToString());
  55.                         BigInteger el = xBigInt.Pow(power).Multiply(elements[power - 1]);
  56.                         W = W.Add(el);
  57.                     }
  58.                     W = W.Add(secret);
  59.                     shares[x - 1] = W.Mod(prime);
  60.                     Console.WriteLine(x + ", " + shares[x-1]);
  61.                 }
  62.                 BigInteger M = new BigInteger("0");
  63.                 Console.WriteLine("Odtworzony sekret: ");
  64.                 for (int x = 1; x <= requiredAcceptances[i]; x++)
  65.                 {
  66.                     BigInteger xBigInt = new BigInteger(x.ToString());
  67.                     BigInteger part = shares[x-1];
  68.                     for (int xup = x+1; xup <= requiredAcceptances[i]; xup++)
  69.                     {
  70.                         BigInteger xupBigInt = new BigInteger(xup.ToString());
  71.                         BigInteger tmp = xupBigInt.Multiply(new BigInteger("-1")).Mod(prime);
  72.                         BigInteger tmp2 = xBigInt.Subtract(xupBigInt).Mod(prime);
  73.                         part = part.Multiply(tmp.Multiply(tmp2));
  74.                     }
  75.                     for (int xdown = x-1; xdown >= 1; xdown--)
  76.                     {
  77.                         BigInteger xdownBigInt = new BigInteger(xdown.ToString());
  78.                         BigInteger tmp = xdownBigInt.Multiply(new BigInteger("-1").Mod(prime));
  79.                         BigInteger tmp2 = xBigInt.Subtract(xdownBigInt).ModInverse(prime);
  80.                         part = part.Multiply(tmp.Multiply(tmp2));
  81.                     }
  82.                     M = M.Add(part.Mod(prime));
  83.                 }
  84.                 M = M.Mod(prime);
  85.                 Console.WriteLine(M);
  86.             }
  87.             Console.ReadLine();
  88.             return;
  89.         }
  90.  
  91.         private static Random random = new Random();
  92.  
  93.         static int secretSize()
  94.         {
  95.             return 6;
  96.         }
  97.         static string getRandomSecretString(int length)
  98.         {
  99.             const string chars = "0123456789";
  100.             return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
  101.         }
  102.     }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement