public void FVEncryptDecryptNET() { var parms = new EncryptionParameters { DecompositionBitCount = 4, NoiseStandardDeviation = 3.19, NoiseMaxDeviation = 35.06 }; var coeffModulus = parms.CoeffModulus; coeffModulus.Resize(48); coeffModulus.Set("FFFFFFFFC001"); var plainModulus = parms.PlainModulus; plainModulus.Resize(7); plainModulus.Set(1 << 6); var polyModulus = parms.PolyModulus; polyModulus.Resize(64, 1); polyModulus[0].Set(1); polyModulus[63].Set(1); var Encoder = new BinaryEncoder(parms.PlainModulus); var keygen = new KeyGenerator(parms); keygen.Generate(); var encryptor = new Encryptor(parms, keygen.PublicKey); Assert.AreEqual(encryptor.PublicKey[0], keygen.PublicKey[0]); Assert.AreEqual(encryptor.PublicKey[1], keygen.PublicKey[1]); var decryptor = new Decryptor(parms, keygen.SecretKey); Assert.AreEqual(decryptor.SecretKey, keygen.SecretKey); var encrypted = encryptor.Encrypt(Encoder.Encode(0x12345678)); Assert.AreEqual(0x12345678U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0)); Assert.AreEqual(0U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(1)); Assert.AreEqual(1U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(2)); Assert.AreEqual(2U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFDUL)); Assert.AreEqual(0x7FFFFFFFFFFFFFFDUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFEUL)); Assert.AreEqual(0x7FFFFFFFFFFFFFFEUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFFUL)); Assert.AreEqual(0x7FFFFFFFFFFFFFFFUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted))); }
public void EncryptAddDecryptNET() { var parms = new EncryptionParameters { DecompositionBitCount = 4, NoiseStandardDeviation = 3.19, NoiseMaxDeviation = 35.06 }; var coeffModulus = parms.CoeffModulus; coeffModulus.Resize(48); coeffModulus.Set("FFFFFFFFC001"); var plainModulus = parms.PlainModulus; plainModulus.Resize(7); plainModulus.Set(1 << 6); var polyModulus = parms.PolyModulus; polyModulus.Resize(64, 1); polyModulus[0].Set(1); polyModulus[63].Set(1); var keygen = new KeyGenerator(parms); keygen.Generate(); var Encoder = new BinaryEncoder(parms.PlainModulus); var encryptor = new Encryptor(parms, keygen.PublicKey); var evaluator = new Evaluator(parms, keygen.EvaluationKeys); var decryptor = new Decryptor(parms, keygen.SecretKey); var encrypted1 = encryptor.Encrypt(Encoder.Encode(0x12345678)); var encrypted2 = encryptor.Encrypt(Encoder.Encode(0x54321)); var sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(0x12399999UL, Encoder.DecodeUInt64(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(Encoder.Encode(0)); encrypted2 = encryptor.Encrypt(Encoder.Encode(0)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(0UL, Encoder.DecodeUInt64(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(Encoder.Encode(0)); encrypted2 = encryptor.Encrypt(Encoder.Encode(5)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(5UL, Encoder.DecodeUInt64(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(Encoder.Encode(5)); encrypted2 = encryptor.Encrypt(Encoder.Encode(-3)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(2, Encoder.DecodeInt32(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(Encoder.Encode(-7)); encrypted2 = encryptor.Encrypt(Encoder.Encode(2)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(-5, Encoder.DecodeInt32(decryptor.Decrypt(sum))); }
public void BinaryEncodeDecodeUInt64NET() { var modulus = new BigUInt("FFFFFFFFFFFFFFFF"); var encoder = new BinaryEncoder(modulus); var poly = encoder.Encode(0UL); Assert.AreEqual(0, poly.GetSignificantCoeffCount()); Assert.IsTrue(poly.IsZero); Assert.AreEqual(0UL, encoder.DecodeUInt64(poly)); var poly1 = encoder.Encode(1UL); Assert.AreEqual(1, poly1.GetSignificantCoeffCount()); Assert.AreEqual(1, poly1.CoeffBitCount); Assert.AreEqual("1", poly1.ToString()); Assert.AreEqual(1UL, encoder.DecodeUInt64(poly1)); var poly2 = encoder.Encode(2UL); Assert.AreEqual(2, poly2.GetSignificantCoeffCount()); Assert.AreEqual(1, poly2.CoeffBitCount); Assert.AreEqual("1x^1", poly2.ToString()); Assert.AreEqual(2UL, encoder.DecodeUInt64(poly2)); var poly3 = encoder.Encode(3UL); Assert.AreEqual(2, poly3.GetSignificantCoeffCount()); Assert.AreEqual(1, poly3.CoeffBitCount); Assert.AreEqual("1x^1 + 1", poly3.ToString()); Assert.AreEqual(3UL, encoder.DecodeUInt64(poly3)); var poly4 = encoder.Encode(0xFFFFFFFFFFFFFFFFUL); Assert.AreEqual(64, poly4.GetSignificantCoeffCount()); Assert.AreEqual(1, poly4.CoeffBitCount); for (int i = 0; i < 64; ++i) { Assert.AreEqual("1", poly4[i].ToString()); } Assert.AreEqual(0xFFFFFFFFFFFFFFFFUL, encoder.DecodeUInt64(poly4)); var poly5 = encoder.Encode(0x80F02UL); Assert.AreEqual(20, poly5.GetSignificantCoeffCount()); Assert.AreEqual(1, poly5.CoeffBitCount); for (int i = 0; i < 20; ++i) { if (i == 19 || (i >= 8 && i <= 11) || i == 1) { Assert.AreEqual("1", poly5[i].ToString()); } else { Assert.IsTrue(poly5[i].IsZero); } } Assert.AreEqual(0x80F02UL, encoder.DecodeUInt64(poly5)); var poly6 = new BigPoly(3, 10); poly6[0].Set(1); poly6[1].Set(500); poly6[2].Set(1023); Assert.AreEqual((1UL + 500 * 2 + 1023 * 4), encoder.DecodeUInt64(poly6)); modulus.Set(1024); var encoder2 = new BinaryEncoder(modulus); var poly7 = new BigPoly(4, 10); poly7[0].Set(1023); // -1 (*1) poly7[1].Set(512); // -512 (*2) poly7[2].Set(511); // 511 (*4) poly7[3].Set(1); // 1 (*8) Assert.AreEqual((ulong)(-1 + -512 * 2 + 511 * 4 + 1 * 8), encoder2.DecodeUInt64(poly7)); }
public void EvaluateTestModeNET() { var parms = new EncryptionParameters { DecompositionBitCount = 4, NoiseStandardDeviation = 3.19, NoiseMaxDeviation = 35.06, Mode = EncryptionMode.Test }; var coeffModulus = parms.CoeffModulus; coeffModulus.Resize(48); coeffModulus.Set("FFFFFFFFC001"); var plainModulus = parms.PlainModulus; plainModulus.Resize(7); plainModulus.Set(1 << 6); var polyModulus = parms.PolyModulus; polyModulus.Resize(64, 1); polyModulus[0].Set(1); polyModulus[63].Set(1); var keygen = new KeyGenerator(parms); keygen.Generate(); var Encoder = new BinaryEncoder(parms.PlainModulus); var encryptor = new Encryptor(parms, keygen.PublicKey); var evaluator = new Evaluator(parms, keygen.EvaluationKeys); var decryptor = new Decryptor(parms, keygen.SecretKey); var encrypted = encryptor.Encrypt(Encoder.Encode(0x12345678)); var negated = evaluator.Negate(encrypted); Assert.AreEqual(-0x12345678, Encoder.DecodeInt32(negated)); Assert.AreEqual(-0x12345678, Encoder.DecodeInt32(decryptor.Decrypt(negated))); var plain2 = Encoder.Encode(0x54321); var encrypted2 = encryptor.Encrypt(plain2); var sum = evaluator.Add(encrypted, encrypted2); Assert.AreEqual(0x12399999UL, Encoder.DecodeUInt64(sum)); Assert.AreEqual(0x12399999UL, Encoder.DecodeUInt64(decryptor.Decrypt(sum))); sum = evaluator.AddPlain(encrypted, plain2); Assert.AreEqual(0x12399999UL, Encoder.DecodeUInt64(sum)); Assert.AreEqual(0x12399999UL, Encoder.DecodeUInt64(decryptor.Decrypt(sum))); var diff = evaluator.Sub(encrypted, encrypted2); Assert.AreEqual(0x122F1357, Encoder.DecodeInt32(diff)); Assert.AreEqual(0x122F1357, Encoder.DecodeInt32(decryptor.Decrypt(diff))); diff = evaluator.SubPlain(encrypted, plain2); Assert.AreEqual(0x122F1357, Encoder.DecodeInt32(diff)); Assert.AreEqual(0x122F1357, Encoder.DecodeInt32(decryptor.Decrypt(diff))); var prod = evaluator.Multiply(encrypted, encrypted2); Assert.AreEqual(0x5FCBBBB88D78UL, Encoder.DecodeUInt64(prod)); Assert.AreEqual(0x5FCBBBB88D78UL, Encoder.DecodeUInt64(decryptor.Decrypt(prod))); prod = evaluator.MultiplyPlain(encrypted, plain2); Assert.AreEqual(0x5FCBBBB88D78UL, Encoder.DecodeUInt64(prod)); Assert.AreEqual(0x5FCBBBB88D78UL, Encoder.DecodeUInt64(decryptor.Decrypt(prod))); }
public void FVEncryptDecryptNET() { var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew()); parms.SetDecompositionBitCount(4); parms.SetNoiseStandardDeviation(3.19); parms.SetNoiseMaxDeviation(35.06); var coeffModulus = new BigUInt(48); coeffModulus.Set("FFFFFFFFC001"); parms.SetCoeffModulus(coeffModulus); var plainModulus = new BigUInt(7); plainModulus.Set(1 << 6); parms.SetPlainModulus(plainModulus); var polyModulus = new BigPoly(65, 1); polyModulus[0].Set(1); polyModulus[64].Set(1); parms.SetPolyModulus(polyModulus); parms.Validate(); var Encoder = new BinaryEncoder(parms.PlainModulus, MemoryPoolHandle.AcquireNew()); var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew()); keygen.Generate(); var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew()); Assert.AreEqual(encryptor.PublicKey[0], keygen.PublicKey[0]); Assert.AreEqual(encryptor.PublicKey[1], keygen.PublicKey[1]); var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew()); Assert.AreEqual(decryptor.SecretKey, keygen.SecretKey); var encrypted = encryptor.Encrypt(Encoder.Encode(0x12345678)); Assert.AreEqual(0x12345678U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0)); Assert.AreEqual(0U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(1)); Assert.AreEqual(1U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(2)); Assert.AreEqual(2U, Encoder.DecodeUInt32(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFDUL)); Assert.AreEqual(0x7FFFFFFFFFFFFFFDUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFEUL)); Assert.AreEqual(0x7FFFFFFFFFFFFFFEUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted))); encrypted = encryptor.Encrypt(Encoder.Encode(0x7FFFFFFFFFFFFFFFUL)); Assert.AreEqual(0x7FFFFFFFFFFFFFFFUL, Encoder.DecodeUInt64(decryptor.Decrypt(encrypted))); }
public void BinaryEncodeDecodeUInt64NET() { var modulus = new SmallModulus(0xFFFFFFFFFFFFFFF); var encoder = new BinaryEncoder(modulus, MemoryPoolHandle.New()); var poly = encoder.Encode(0UL); Assert.AreEqual(0, poly.SignificantCoeffCount()); Assert.IsTrue(poly.IsZero); Assert.AreEqual(0UL, encoder.DecodeUInt64(poly)); var poly1 = encoder.Encode(1UL); Assert.AreEqual(1, poly1.SignificantCoeffCount()); Assert.AreEqual("1", poly1.ToString()); Assert.AreEqual(1UL, encoder.DecodeUInt64(poly1)); var poly2 = encoder.Encode(2UL); Assert.AreEqual(2, poly2.SignificantCoeffCount()); Assert.AreEqual("1x^1", poly2.ToString()); Assert.AreEqual(2UL, encoder.DecodeUInt64(poly2)); var poly3 = encoder.Encode(3UL); Assert.AreEqual(2, poly3.SignificantCoeffCount()); Assert.AreEqual("1x^1 + 1", poly3.ToString()); Assert.AreEqual(3UL, encoder.DecodeUInt64(poly3)); var poly4 = encoder.Encode(0xFFFFFFFFFFFFFFFFUL); Assert.AreEqual(64, poly4.SignificantCoeffCount()); for (int i = 0; i < 64; ++i) { Assert.AreEqual("1", poly4[i].ToString()); } Assert.AreEqual(0xFFFFFFFFFFFFFFFFUL, encoder.DecodeUInt64(poly4)); var poly5 = encoder.Encode(0x80F02UL); Assert.AreEqual(20, poly5.SignificantCoeffCount()); for (int i = 0; i < 20; ++i) { if (i == 19 || (i >= 8 && i <= 11) || i == 1) { Assert.AreEqual("1", poly5[i].ToString()); } else { Assert.IsTrue(poly5[i] == 0); } } Assert.AreEqual(0x80F02UL, encoder.DecodeUInt64(poly5)); var poly6 = new Plaintext(3); poly6[0] = 1; poly6[1] = 500; poly6[2] = 1023; Assert.AreEqual((1UL + 500 * 2 + 1023 * 4), encoder.DecodeUInt64(poly6)); modulus.Set(1024); var encoder2 = new BinaryEncoder(modulus, MemoryPoolHandle.New()); var poly7 = new Plaintext(4); poly7[0] = 1023; // -1 (*1) poly7[1] = 512; // -512 (*2) poly7[2] = 511; // 511 (*4) poly7[3] = 1; // 1 (*8) Assert.AreEqual((ulong)(-1 + -512 * 2 + 511 * 4 + 1 * 8), encoder2.DecodeUInt64(poly7)); }
public void FVEncryptAddDecryptNET() { var parms = new EncryptionParameters(MemoryPoolHandle.AcquireNew()); parms.SetDecompositionBitCount(4); parms.SetNoiseStandardDeviation(3.19); parms.SetNoiseMaxDeviation(35.06); var coeffModulus = new BigUInt(48); coeffModulus.Set("FFFFFFFFC001"); parms.SetCoeffModulus(coeffModulus); var plainModulus = new BigUInt(7); plainModulus.Set(1 << 6); parms.SetPlainModulus(plainModulus); var polyModulus = new BigPoly(65, 1); polyModulus[0].Set(1); polyModulus[64].Set(1); parms.SetPolyModulus(polyModulus); parms.Validate(); var keygen = new KeyGenerator(parms, MemoryPoolHandle.AcquireNew()); keygen.Generate(); var encoder = new BinaryEncoder(parms.PlainModulus, MemoryPoolHandle.AcquireNew()); var encryptor = new Encryptor(parms, keygen.PublicKey, MemoryPoolHandle.AcquireNew()); var evaluator = new Evaluator(parms, MemoryPoolHandle.AcquireNew()); var decryptor = new Decryptor(parms, keygen.SecretKey, MemoryPoolHandle.AcquireNew()); var encrypted1 = encryptor.Encrypt(encoder.Encode(0x12345678)); var encrypted2 = encryptor.Encrypt(encoder.Encode(0x54321)); var sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(0x12399999UL, encoder.DecodeUInt64(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(encoder.Encode(0)); encrypted2 = encryptor.Encrypt(encoder.Encode(0)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(0UL, encoder.DecodeUInt64(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(encoder.Encode(0)); encrypted2 = encryptor.Encrypt(encoder.Encode(5)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(5UL, encoder.DecodeUInt64(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(encoder.Encode(5)); encrypted2 = encryptor.Encrypt(encoder.Encode(-3)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(2, encoder.DecodeInt32(decryptor.Decrypt(sum))); encrypted1 = encryptor.Encrypt(encoder.Encode(-7)); encrypted2 = encryptor.Encrypt(encoder.Encode(2)); sum = evaluator.Add(encrypted1, encrypted2); Assert.AreEqual(-5, encoder.DecodeInt32(decryptor.Decrypt(sum))); }