Das Paillier Cryptosystem mit Beispielen in Cran-R Thomas Liebig
[email protected] 15. Dezember 2015 Das Kryptosystem besteht aus drei Komponenten: (1) Schlüsselgenerierung, (2) Verschlüsselung, und (3) Entschlüsselung.
1 Schlüsselgenerierung Wähle zwei Primzahlen p und q. n = p · q, g mit |g| ist n in Z∗n2 . Der öffentliche Schlüssel ist dann das Tupel (n, g). Carmichael’s function λ(n) ist das kleinste m zu einer Zahl n, so dass ∀a, ggT (a, n) = 1 gilt: am ≡ 1 mod n. Wenn p und q Primfaktoren von n sind, ist λ(n) = kgV (ϕ(p), ϕ(q)). Für den Fall, dass p und q Primzahlen sind gilt damit: λ(n) = kgV (p − 1, q − 1). λ ist der private Schlüssel.
2 Eigenschaften ∀w ∈ Z∗n2 : wλ ≡ 1 mod n und wnλ ≡ 1 mod n2 . Die Menge Sn = {u < n2 |u = 1 mod n} ist eine multiplikative Teilmenge modulo n2 auf der die Funktion L(u) = (u − 1)/n für alle u ∈ Sn wohldefiniert ist.
3 Verschlüsselung Eg : Zn × Z∗n Eg (x, y)
→ Z∗n2 → g x · y n mod n2
Eg (m, r)
→ g m · rn mod n2
4 Entschlüsselung m = L(cλ mod n2 ) ∗ L−1 (g λ mod n2 ) mit L(x) = (x − 1)/n 1
5 Beispiel require("pracma") require("numbers")
# provides gcd() # provides isPrime(), modpower()
p=3 q=5
Schlüsselgenerierung n=p*q phi=(p-1)*(q-1) g=n+1 lambda=Lcm((p-1),(q-1)) # = (p-1)*(q-1)/gcd((p-1),(q-1)) n = 15, ϕ(n) = 8, λ(n) = 4, g = 16
Berechnung von A = Z∗n2 A=matrix(ncol=n,nrow=phi) j=0 for (i in 1:phi) { j=j+1 while (gcd(j,n)!=1) {j=j+1} for (m in 0:(n-1)) { A[i,(m+1)]=(modpower(g,m,(n^2)) * modpower(j,n,(n^2))) %% n^2 } }
Betrachtung von A >print(A) r\m 1 2 4 7 8 11 13 14
0 1 143 199 118 107 26 82 224
1 16 38 34 88 137 191 187 209
2 31 158 94 58 167 131 67 194
3 46 53 154 28 197 71 172 179
4 61 173 214 223 2 11 52 164
5 76 68 49 193 32 176 157 149
2
6 91 188 109 163 62 116 37 134
7 106 83 169 133 92 56 142 119
8 121 203 4 103 122 221 22 104
9 136 98 64 73 152 161 127 89
10 151 218 124 43 182 101 7 74
11 166 113 184 13 212 41 112 59
12 181 8 19 208 17 206 217 44
13 196 128 79 178 47 146 97 29
14 211 23 139 148 77 86 202 14
Betrachtung von Aλ >modpower(A,lambda,n^2)
[1,] [2,] [3,] [4,] [5,] [6,] [7,] [8,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166 1 61 121 181 16 76 136 196 31 91 151 211 46 106 166
Betrachtung von L(Aλ ) mod n2 >((modpower(A,lambda,n^2)-1)/n)
[1,] [2,] [3,] [4,] [5,] [6,] [7,] [8,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11 0 4 8 12 1 5 9 13 2 6 10 14 3 7 11
Betrachtung von L(Aλ )/L(g λ ) mod n L(g λ mod n2 ) = L(61) = 60/15 = 4 L−1 (g λ mod n2 ) = 4 > Lg = (modpower(g,lambda,n^2)-1)/n > Lg_inv = (extGCD(Lg,n)[2]+n) %% n >(((modpower(A,lambda,n^2)-1)/n) * Lg_inv) %% n
[1,] [2,] [3,] [4,] [5,] [6,] [7,] [8,]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
3
Homeomorphie 92 = (191 ∗ 37) mod 152
Entschlüsselung (((((774 ) mod (152 )) − 1)/15) ∗ 4) mod 15 = 14 (((((7^4) %% (15^2))-1)/15) * 4) %% 15 = 10 (((((164^4) %% (15^2))-1)/15) * 4) %% 15 = 4 (((((82^4) %% (15^2))-1)/15) * 4) %% 15 = 0 (((((98^4) %% (15^2))-1)/15) * 4) %% 15 = 9
6 Quelltext require("pracma") require("numbers")
# provides gcd() # provides isPrime(), modpower()
p=3 q=5 n=p*q phi=(p-1)*(q-1) g=n+1 lambda=Lcm((p-1),(q-1)) # = (p-1)*(q-1)/gcd((p-1),(q-1)) encrypt