diff --git a/bin/ckks.o b/bin/ckks.o index a9db71f2c10d6a4cb920d45aa5c634611f8d0cf5..581a997abe79b44212a9fde32de6aa3f4085a637 100644 Binary files a/bin/ckks.o and b/bin/ckks.o differ diff --git a/bin/encoder.o b/bin/encoder.o index ef7f57bf2f19eb83b8f800e61d192892fa7a4f53..204d296b9567fbaaa8580d64efee32a46fcccf15 100644 Binary files a/bin/encoder.o and b/bin/encoder.o differ diff --git a/bin/evalkey.o b/bin/evalkey.o index 11ee60d8cd8461b178700bb1bec57d0f8b23cf57..d611734c4173a13cec8287d32567469ca02170d4 100644 Binary files a/bin/evalkey.o and b/bin/evalkey.o differ diff --git a/bin/pubkey.o b/bin/pubkey.o index deacc305c00ea25f96ee5f79ffbfd14374b63887..5ef768e30378c447d4432460dc79f144d93ac71a 100644 Binary files a/bin/pubkey.o and b/bin/pubkey.o differ diff --git a/run b/run index 33d2612199897b9cc421709da90bbe9a19ce84c9..f543ad7ed63fc9674d3a174649740b63efdbf26e 100755 Binary files a/run and b/run differ diff --git a/src/ckks.cpp b/src/ckks.cpp index e57c21c276115b4622361bb31ed8917dd497d0d6..30e7d9d826eae96b9eb38a34047ae6e434d2e191 100644 --- a/src/ckks.cpp +++ b/src/ckks.cpp @@ -29,7 +29,7 @@ Polynomial CKKS::genE(int degree, double var){ errCoeffs[i] = (double) round(dis(gen)); } - Polynomial err(4, errCoeffs); + Polynomial err(degree, errCoeffs); return err; } @@ -49,7 +49,7 @@ Polynomial CKKS::genZO(){ } Ciphertext CKKS::encrypt(Polynomial pt){ - Polynomial e = genE(4, 1.0); + Polynomial e = genE(pt.degree, 1.0); Polynomial c0 = (pt) + pk.b; Polynomial c1 = pk.a; diff --git a/src/evalkey.cpp b/src/evalkey.cpp index a71b07bf9f5d6d5819abe126810ccb1fe5f5b2bf..a8288cf2a4d8846e3127c51df88984f65d99ce0c 100644 --- a/src/evalkey.cpp +++ b/src/evalkey.cpp @@ -6,16 +6,31 @@ using namespace std; -EvalKey::EvalKey(Polynomial _s, int q){ - a = Polynomial(4); - b = Polynomial(4); +EvalKey::EvalKey(Polynomial _s, int degree, int q){ + a = Polynomial(degree); + b = Polynomial(degree); p = 1000; s = _s; - cout << q << endl; - generateA(4, 4); + + generateA(4, 1000); computeB(q); } +Polynomial EvalKey::genE(int degree, double var){ + double errCoeffs[degree]; + + random_device rd; + mt19937 gen(rd()); + normal_distribution<double> dis(0, var); + + for(int i=0; i<degree; i++){ + errCoeffs[i] = (double) round(dis(gen)); + } + + Polynomial err(degree, errCoeffs); + return err; +} + void EvalKey::generateA(int degree, int q){ int half_q = (p*q)/2; random_device rd; @@ -30,11 +45,9 @@ void EvalKey::generateA(int degree, int q){ } void EvalKey::computeB(int q){ - cout << "eval" << endl; - double e[4] = {0.0, 0.0, 0.0, 0.0}; - Polynomial err(4, e); + Polynomial err = genE(a.degree, 1.0); Polynomial ev = (s * s).scaleCoeff(p); - Polynomial temp = ((a.scaleCoeff(-1.0)) * s) + ev; + Polynomial temp = ((a.scaleCoeff(-1.0)) * s) + ev + err; Polynomial res = temp.modCoeff(q * p); b.setDegree(res.degree); diff --git a/src/evalkey.h b/src/evalkey.h index a1fbcf303bb1699a73be563383373b0683a99c3d..eeb4f8bc2e3892fb80e88f8561944a08af9236c0 100644 --- a/src/evalkey.h +++ b/src/evalkey.h @@ -11,7 +11,8 @@ class EvalKey{ int p; EvalKey() = default; - EvalKey(Polynomial _s, int q); + EvalKey(Polynomial _s, int degree, int q); + Polynomial genE(int degree, double var); void generateA(int degree, int q); void computeB(int q); }; diff --git a/src/pubkey.cpp b/src/pubkey.cpp index 7835cf26ca0065cfa0475503c899a0da12921b50..e52c1314fc0d2b675d64db2f02a5f28efc41ad36 100644 --- a/src/pubkey.cpp +++ b/src/pubkey.cpp @@ -6,15 +6,30 @@ using namespace std; -PubKey::PubKey(Polynomial _s, int q){ - a = Polynomial(4); - b = Polynomial(4); +PubKey::PubKey(Polynomial _s, int degree, int q){ + a = Polynomial(degree); + b = Polynomial(degree); s = _s; - generateA(4, 4); + generateA(4, 100); computeB(q); } +Polynomial PubKey::genE(int degree, double var){ + double errCoeffs[degree]; + + random_device rd; + mt19937 gen(rd()); + normal_distribution<double> dis(0, var); + + for(int i=0; i<degree; i++){ + errCoeffs[i] = (double) round(dis(gen)); + } + + Polynomial err(degree, errCoeffs); + return err; +} + void PubKey::generateA(int degree, int q){ int half_q = q/2; random_device rd; @@ -29,8 +44,7 @@ void PubKey::generateA(int degree, int q){ } void PubKey::computeB(int q){ - double e[4] = {0.0, 0.0, 0.0, 0.0}; - Polynomial err(4, e); + Polynomial err = genE(a.degree, 1.0); Polynomial temp = (a.scaleCoeff(-1.0)) * s + err; Polynomial res = temp.modCoeff(q); diff --git a/src/pubkey.h b/src/pubkey.h index 4ab3dfaf52a203182bc19cd3af3e0c248a70f97c..1c12e4c76cf4a8a836520d6e2dcf96d81f0abf86 100644 --- a/src/pubkey.h +++ b/src/pubkey.h @@ -10,7 +10,8 @@ class PubKey{ Polynomial s; PubKey() = default; - PubKey(Polynomial _s, int q); + PubKey(Polynomial _s, int degree, int q); + Polynomial genE(int degree, double var); void generateA(int degree, int q); void computeB(int q); }; diff --git a/test.cpp b/test.cpp index bea18461eba5c3cb754010535a3b7029afb4ff7e..2df90f3d1918ebc88b2aa27a6d1a443121116b93 100644 --- a/test.cpp +++ b/test.cpp @@ -23,8 +23,8 @@ int main(){ } SecKey sk = SecKey(); - PubKey pk(sk.s, ql); - EvalKey evk(sk.s, ql); + PubKey pk(sk.s, 4, ql); + EvalKey evk(sk.s, 4, ql); Polynomial pt2 = pt * pt; pt2.printPol(); @@ -33,20 +33,18 @@ int main(){ Ciphertext ct = ckks.encrypt(pt); Ciphertext ctadd = ckks.mult(ct, ct); - Polynomial ptOut = ckks.decrypt(ctadd); //problem dcomparr output = enc.decode(ptOut); cout << "test" << endl; - cout << endl; cout << "Experiment" << endl; cout << "polynomial: "; ptOut.printPol(); for(int i=0; i<4; i++){ - cout << output.arr[i] << " "; + cout << output.arr[i]/1.0 << " "; } cout << endl; diff --git a/test.o b/test.o index 5b27ef5b001a4ae14d9d78a528189aa90779265f..0e498838f94daa08e019afa313471f617252a30f 100644 Binary files a/test.o and b/test.o differ