public Key AddOwnSecretKey(Key key) { if (KnownAlgorithm == Algorithm.ECC) { var eccKey = (ECCKey)key; var keyPair = (ECCKey)KeyPair; eccKey.OpenKey = ECCPoint.Multiply(keyPair.PrivateKey, eccKey.OpenKey); return(eccKey); } if (KnownAlgorithm == Algorithm.RSA) { } return(key); }
/// <summary> /// Key = Na x Pa x Pb x ... x Pi /// Where Pi = Ni x G /// </summary> /// <param name="allPersons"></param> /// <returns></returns> private BigInteger GenerateSymetricWithECC(List <Person> allPersons) { var keyPair = (ECCKey)KeyPair; var symmetricKey = keyPair.Copy(); //get key = i x G, where i -> count of persons symmetricKey.OpenKey = ECCPoint.Multiply(allPersons.Count, keyPair.G); //get key = Na x i x G symmetricKey.OpenKey = ECCPoint.Multiply(keyPair.PrivateKey, symmetricKey.OpenKey); //now each person have to add own key foreach (var person in allPersons) { //Key = Na x i x G x Na x Nb x ... x Ni person.AddOwnSecretKey(symmetricKey); } var left = symmetricKey.OpenKey.X.ToByteArray(); var right = symmetricKey.OpenKey.Y.ToByteArray(); var key = left.Concat(right).ToArray(); return(new BigInteger(key)); }
static void Main(string[] args) { var keyPaillier = PaillierManager.Default.GenerateKey(); //var test = PaillierManager.Default.EncryptNumber(1, keyPaillier); //var resTest = PaillierManager.Default.DecryptNumber(test, keyPaillier); string paillierLog = ""; StartTimer(); mpz_t sumPaillier = PaillierManager.Default.EncryptNumber(0, keyPaillier); for (var i = 0; i <= 10000; i++) { var newNumber = PaillierManager.Default.EncryptNumber(i + 1, keyPaillier); sumPaillier = PaillierManager.Default.Multiply(sumPaillier, newNumber, keyPaillier); if (i % 100 == 0) { var time = StopWatch.Elapsed; paillierLog += $"({i}) - {time.Minutes}:{time.Seconds}.{time.Milliseconds:000}" + Environment.NewLine; } } StopTimer(); StartTimer(); var m = PaillierManager.Default.DecryptNumber(sumPaillier, keyPaillier); var time2 = StopWatch.Elapsed; paillierLog += $"(decrypt) - {time2.Minutes}:{time2.Seconds}.{time2.Milliseconds:000}" + Environment.NewLine; StopTimer(); var file = new FileWriter(); file.Write(paillierLog); System.Console.WriteLine(paillierLog); //System.Console.WriteLine(m.ToString()); //System.Console.ReadKey(); var numbers = new[] { 1, 2, 3 }; //var sum = numbers.Sum(); var keyEcc = ECCManager.Default256.GenerateKey(); var s1 = ECCManager.Default256.EncryptNumber(numbers[0], keyEcc.OpenKey); var s2 = ECCManager.Default256.EncryptNumber(numbers[1], keyEcc.OpenKey); var s3 = ECCManager.Default256.EncryptNumber(numbers[2], keyEcc.OpenKey); var sResRight = s1.Right + s2.Right + s3.Right; var sResLeft = s1.Left + s2.Left + s3.Left; var res = sResRight - ECCPoint.Multiply(keyEcc.PrivateKey, sResLeft); StartTimer(); List <ECCPoint> rightParts = new List <ECCPoint>(1000); List <ECCPoint> leftParts = new List <ECCPoint>(1000); ECCPoint sumRight = null; ECCPoint sumLeft = null; string eccLog = ""; for (var i = 0; i <= 10000; i++) { var encryptedNumber = ECCManager.Default256.EncryptNumber(i + 1, keyEcc.OpenKey); rightParts.Add(encryptedNumber.Right); leftParts.Add(encryptedNumber.Left); if (i == 2) { sumRight = rightParts[0] + rightParts[1]; sumLeft = leftParts[0] + leftParts[1]; } if (i > 2) { sumRight = sumRight + encryptedNumber.Right; sumLeft = sumLeft + encryptedNumber.Left; } if (i % 100 == 0) { var time = StopWatch.Elapsed; eccLog += $"({i}) - {time.Minutes}:{time.Seconds}.{time.Milliseconds:000}" + Environment.NewLine; } } StopTimer(); StartTimer(); var result = sumRight - ECCPoint.Multiply(keyEcc.PrivateKey, sumLeft); var time1 = StopWatch.Elapsed; eccLog += $"(decrypt) - {time1.Minutes}:{time1.Seconds}.{time1.Milliseconds:000}" + Environment.NewLine; StopTimer(); file.Write(eccLog); System.Console.WriteLine(eccLog); //var s1 = ECCManager.Default.EncryptNumber(numbers[0], keyPairs.OpenKey); //var s2 = ECCManager.Default.EncryptNumber(numbers[1], keyPairs.OpenKey); //var s3 = ECCManager.Default.EncryptNumber(numbers[2], keyPairs.OpenKey); //var sResRight = s1.Right + s2.Right + s3.Right; //var sResLeft = s1.Left + s2.Left + s3.Left; //var res = sResRight - ECCPoint.Multiply(keyPairs.PrivateKey, sResLeft); //var sumPoint = ECCPoint.Multiply(sum, keyPairs.G); //if (res == sumPoint) //{ // System.Console.WriteLine("Correct"); //} var end = System.Console.ReadKey(); }