Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Org.BouncyCastle.Math;
- namespace secret
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine("Bartłomiej Wolnik, gr.A");
- string secretString = getRandomSecretString(secretSize());
- Console.WriteLine("Sekret: " + secretString);
- Console.WriteLine("--------");
- int[] senatorNumbers = { 6, 4, 10 };
- int[] requiredAcceptances = { 3, 3, 6 };
- BigInteger[] regionSecrets = new BigInteger[3];
- for (int i = 0; i < 3; i++)
- {
- string regionSecretString = secretString.Substring(i * (secretString.Length / 3), secretString.Length / 3);
- regionSecrets[i] = new BigInteger(regionSecretString);
- }
- for (int i = 0; i < 3; i++)
- {
- BigInteger secret = regionSecrets[i];
- BigInteger prime = secret.NextProbablePrime();
- Console.WriteLine();
- Console.WriteLine("Sekret dla regionu " + i + ":");
- Console.WriteLine(secret);
- Console.WriteLine("prime: " + prime);
- BigInteger[] elements = new BigInteger[requiredAcceptances[i] - 1];
- BigInteger[] shares = new BigInteger[senatorNumbers[i]];
- for (int j = 0; j < requiredAcceptances[i] - 1; j++)
- {
- BigInteger randomBigInteger;
- do
- {
- randomBigInteger = new BigInteger(getRandomSecretString(secretSize()/3));
- } while (randomBigInteger.CompareTo(secret) > 0);
- elements[j] = randomBigInteger;
- }
- Console.WriteLine("Udziały: ");
- for (int x = 1; x <= senatorNumbers[i]; x++)
- {
- BigInteger W = new BigInteger("0");
- for (int power = 1; power < requiredAcceptances[i]; power++)
- {
- BigInteger xBigInt = new BigInteger(x.ToString());
- BigInteger el = xBigInt.Pow(power).Multiply(elements[power - 1]);
- W = W.Add(el);
- }
- W = W.Add(secret);
- shares[x - 1] = W.Mod(prime);
- Console.WriteLine(x + ", " + shares[x-1]);
- }
- BigInteger M = new BigInteger("0");
- Console.WriteLine("Odtworzony sekret: ");
- for (int x = 1; x <= requiredAcceptances[i]; x++)
- {
- BigInteger xBigInt = new BigInteger(x.ToString());
- BigInteger part = shares[x-1];
- for (int xup = x+1; xup <= requiredAcceptances[i]; xup++)
- {
- BigInteger xupBigInt = new BigInteger(xup.ToString());
- BigInteger tmp = xupBigInt.Multiply(new BigInteger("-1")).Mod(prime);
- BigInteger tmp2 = xBigInt.Subtract(xupBigInt).Mod(prime);
- part = part.Multiply(tmp.Multiply(tmp2));
- }
- for (int xdown = x-1; xdown >= 1; xdown--)
- {
- BigInteger xdownBigInt = new BigInteger(xdown.ToString());
- BigInteger tmp = xdownBigInt.Multiply(new BigInteger("-1").Mod(prime));
- BigInteger tmp2 = xBigInt.Subtract(xdownBigInt).ModInverse(prime);
- part = part.Multiply(tmp.Multiply(tmp2));
- }
- M = M.Add(part.Mod(prime));
- }
- M = M.Mod(prime);
- Console.WriteLine(M);
- }
- Console.ReadLine();
- return;
- }
- private static Random random = new Random();
- static int secretSize()
- {
- return 6;
- }
- static string getRandomSecretString(int length)
- {
- const string chars = "0123456789";
- return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement