knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
Load libraries that will be used.
library(polynom) library(HomomorphicEncryption)
Set some parameters.
d = 4 n = 2^d p = (n/2)-1 q = 874
Set a working seed for random numbers
set.seed(123)
Here we create the polynomial modulo.
pm = polynomial( coef=c(1, rep(0, n-1), 1 ) ) print(pm)
Create the secret key.
# generate a secret key s = polynomial( sample.int(3, n, replace=TRUE)-2 ) print(s)
Create a (part of the public key)
# generate a a = polynomial(sample.int(q, n, replace=TRUE)) print(a)
Create the error term e
to be used to generate the public key.
# generate the error e = polynomial( coef=round(stats::rnorm(n, 0, n/3)) ) print(e)
Generate Part 1 of the Public Key.
pk1 = -(a*s + e) pk1 = pk1 %% pm pk1 = CoefMod(pk1, q) print(pk1)
Generate Part 2 of the Public Key (which is actually just equal to a).
pk2 = a
Create a polynomial message
# create a message m = polynomial( coef=c(6, 4, 2) )
Create polynomials for the encryption of the message. Since e1 and e2 are constructed the same way as e, we don't print them, we just print u.
# polynomials for encryption e1 = polynomial( coef=round(stats::rnorm(n, 0, n/3)) ) e2 = polynomial( coef=round(stats::rnorm(n, 0, n/3)) ) u = polynomial( coef=sample.int(3, (n-1), replace=TRUE)-2 ) print(u)
Generate Part 1 of the ciphertext version of the message.
ct1 = pk1 * u + e1 + floor(q/p) * m ct1 = ct1 %% pm ct1 = CoefMod(ct1, q) print(ct1)
Generate Part 2 of the ciphertext version of the message.
ct2 = pk2 * u + e2 ct2 = ct2 %% pm ct2 = CoefMod(ct2, q) print(ct2)
Decrypt
decrypt = (ct2 * s) + ct1 decrypt = decrypt %% pm decrypt = CoefMod(decrypt, q) # rescale decrypt = decrypt * p/q
Round (remove the error) then mod p
# round then mod p decrypt = CoefMod(round(decrypt), p) print(decrypt)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.