Lattice-based cryptography uses asymmetric cryptographic primitives based on lattices. This implementation uses the Fan-Vercauteren (FV) homomorphic encryption scheme, and encrypts a batch of integers with a public key, and then operates on the encrypted values with add and subtract.
Lattice Crypto |
Code
The coding is:
package main import ( "fmt" "github.com/lca1/lattigo/bfv" "math/rand" "time" ) var N uint64 var T uint64 var Qi []uint64 var Pi []uint64 var Sigma float64 var bfvContext *bfv.BfvContext func generate(randMatrix []int64) { for i := range randMatrix { randMatrix[i] = int64(rand.Intn(100)) } } func main() { rand.Seed(time.Now().UnixNano()) N = 8 T = 786433 Qi = []uint64{1152921504053723137, 1152921504050839553} Pi = []uint64{576460752308273153, 576460752315482113, 576460752319021057} Sigma = float64(3.19) bfvContext, _ := bfv.NewBfvContextWithParam(N, T, Qi, Pi, Sigma) kgen := bfvContext.NewKeyGenerator() Sk := kgen.NewSecretKey() Decryptor, _ := bfvContext.NewDecryptor(Sk, 2) pks := make([]*bfv.PublicKey, 2, 2) encryptors := make([]*bfv.Encryptor, 2, 2) for i := range pks { pks[i], _ = kgen.NewPublicKey(Sk) encryptors[i],_ = bfvContext.NewEncryptor(pks[i]) } evaluator, _ := bfvContext.NewEvaluator() fmt.Printf("Parameters : N=%d, T=%d, Qi = %dx60, sigma = %f \n", N, T, len(Qi), Sigma) n1 := make([]int64, 5) n2 := make([]int64, 5) generate(n1) generate(n2) // n1 := []int64{7, 5, 3, 4, 0, 17, 21, 99} // n2 := []int64{8, 3, 0, 1, 2, 4, 10, 33} fmt.Printf("Numbers: N1=%v\n",n1) fmt.Printf("Numbers: N2=%v\n",n2) num1 := bfvContext.NewPlaintext() num2 := bfvContext.NewPlaintext() batchEncoder := bfvContext.NewBatchEncoder() batchEncoder.EncodeInt(n1, num1) batchEncoder.EncodeInt(n2, num2) add1, _ := encryptors[0].EncryptNew(num1) add2, _ := encryptors[1].EncryptNew(num2) _ = evaluator.Add(add1, add2, add1) addr, _ := Decryptor.DecryptNew(add1) r1, _ := batchEncoder.DecodeUint(addr) sub1, _ := encryptors[0].EncryptNew(num1) sub2, _ := encryptors[1].EncryptNew(num2) _ = evaluator.Sub(sub1, sub2, sub1) subr, _ := Decryptor.DecryptNew(sub1) r2, _ := batchEncoder.DecodeInt(subr) for i:=0;i<(n1);i++ { fmt.Printf("%d+%d=%d\n",n1[i],n2[i],r1[i]) fmt.Printf("%d-%d=%d\n\n",n1[i],n2[i],r2[i]) } }
A sample run is:
Parameters : N=8, T=786433, Qi = 2x60, sigma = 3.190000 Numbers: N1=[38 43 57 10 11] Numbers: N2=[91 99 32 25 56] 38+91=129 38-91=-53 43+99=142 43-99=-56 57+32=89 57-32=25 10+25=35 10-25=-15 11+56=67 11-56=-45