22.04.2014 Views

a590003

a590003

a590003

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

The Unpack function should accept the output of a batched computation, namely a ciphertext c ′ such that<br />

m i = [[〈c ′ , s ′ 1 〉] q] pi for all i, and then de-aggregate this ciphertext by outputting ciphertexts c ′ 1 , . . . , c′ d under<br />

some possibly different common secret key s ′ 2 such that m i = [[〈c ′ i , s′ 2 〉] q] p1 for all i. Now that all of the<br />

ciphertexts are under a common key and plaintext slot, normal homomorphic operations can resume. With<br />

such Pack and Unpack functions, we could indeed batch the bootstrapping operation. For circuits of large<br />

width (say, at least d) we could reduce the per-gate bootstrapping computation by a factor of d, making it<br />

only quasi-linear in λ. Assuming the Pack and Unpack functions have complexity at most quasi-quadratic<br />

in d (per-gate this is only quasi-linear, since Pack and Unpack operate on d gates), the overall per-gate<br />

computation of a batched-bootstrapped scheme becomes only quasi-linear.<br />

Here, we describe suitable Pack and Unpack functions. These functions will make heavy use of the<br />

automorphisms σ i→j over R that map elements of p i to elements of p j . (See Section 5.1.1.) We note that<br />

Smart and Vercauteren [21] used these automorphisms to construct something similar to our Pack function<br />

(though for unpacking they resorted to bootstrapping). We also note that Lyubashevsky, Peikert and Regev<br />

[14] used these automorphisms to permute the ideal factors q i of the modulus q, which was an essential tool<br />

toward their proof of the pseudorandomness of RLWE.<br />

Toward Pack and Unpack procedures, our main idea is the following. If m is encoded in the free term<br />

as a number in {0, . . . , p − 1} and if m = [[〈c, s〉] q ] pi , then m = [[〈σ i→j (c), σ i→j (s)〉] q ] pj . That is, we can<br />

switch the plaintext slot but leave the decrypted message unchanged by applying the same automorphism<br />

to the ciphertext and the secret key. (These facts follow from the fact that σ i→j is a homomorphism, that<br />

it maps elements of p i to elements of p j , and that it fixes free terms.) Of course, then we have a problem:<br />

the ciphertext is now under a different key, whereas we may want the ciphertext to be under the same key<br />

as other ciphertexts. To get the ciphertexts to be back under the same key, we simply use the SwitchKey<br />

algorithm to switch all of the ciphertexts to a new common key.<br />

Some technical remarks before we describe Pack and Unpack more formally: We mention again that<br />

E.PublicKeyGen is modified in the obvious way so that A·s = p·e rather than 2·e, and that this modification<br />

induces a similar modification in SwitchKeyGen. Also, let u ∈ R be a short element such that u ∈ 1 + p 1<br />

and u ∈ p j for all j ≠ 1. It is obvious that such a u with coefficients in (−p/2, p/2] can be computed<br />

efficiently by first picking any element u ′ such that u ′ ∈ 1 + p 1 and u ′ ∈ p j for all j ≠ 1, and then reducing<br />

the coefficients of u ′ modulo p.<br />

PackSetup(s 1 , s 2 ): Takes as input two secret keys s 1 , s 2 . For all i ∈ [1, d], it runs τ σ1→i (s 1 )→s 2<br />

←<br />

SwitchKeyGen(σ 1→i (s 1 ), s 2 ).<br />

Pack({c i } d i=1 , {τ σ 1→i (s 1 )→s 2<br />

} d i=1 ): Takes as input ciphertexts c 1, . . . , c d such that m i = [[〈c i , s 1 〉] q ] p1 and<br />

0 = [[〈c i , s 1 〉] q ] pj for all j ≠ 1, and also some auxiliary information output by PackSetup. For all i, it does<br />

the following:<br />

• Computes c ∗ i ← σ 1→i(c i ). (Observe: m i = [[〈c ∗ i , σ 1→i(s 1 )〉] q ] pi while 0 = [[〈c ∗ i , σ 1→i(s 1 )〉] q ] pj for<br />

all j ≠ i.)<br />

• Runs c † i ← SwitchKey(τ σ 1→i (s 1 )→s 2<br />

, c ∗ i ) (Observe: Assuming the noise does not wrap, we have that<br />

m i = [[〈c † i , s 2〉] q ] pi and 0 = [[〈c † i , s 2〉] q ] pj for all j ≠ i.)<br />

Finally, it outputs c ← ∑ d<br />

i=1 c† i . (Observe: Assuming the noise does not wrap, we have that m i =<br />

[[〈c, s 2 〉] q ] pi for all i.)<br />

UnpackSetup(s 1 , s 2 ): Takes as input two secret keys s 1 , s 2 . For all i ∈ [1, d], it runs τ σi→1 (s 1 )→s 2<br />

←<br />

SwitchKeyGen(σ i→1 (s 1 ), s 2 ).<br />

21<br />

2. Fully Homomorphic Encryption without Bootstrapping

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!