Mini Kyber
In [1]:
Copied!
import pqlattice as pq
import numpy as np
import pqlattice as pq
import numpy as np
In [ ]:
Copied!
!pip install pqlattice
!pip install pqlattice
In [2]:
Copied!
n = 512
m = 1024
q = 3329
sigma = 3.0
secret_dist = "ternary"
n = 512
m = 1024
q = 3329
sigma = 3.0
secret_dist = "ternary"
In [3]:
Copied!
lwe = pq.random.LWE(n, q, sigma, secret_dist, 80)
secret = lwe.secret
A, b = lwe.sample_matrix(m)
public_key = A, b
secret_key = secret
lwe = pq.random.LWE(n, q, sigma, secret_dist, 80)
secret = lwe.secret
A, b = lwe.sample_matrix(m)
public_key = A, b
secret_key = secret
In [6]:
Copied!
M = 1
U = pq.random.distribution.Uniform(0, 1)
r = U.sample_vector(m)
u = pq.integer.mod(r @ public_key[0], q)
vp = pq.integer.mod(np.dot(b, r), q)
v = pq.integer.mod(vp + M * (q // 2), q)
encrypted_msg = (u, v)
M = 1
U = pq.random.distribution.Uniform(0, 1)
r = U.sample_vector(m)
u = pq.integer.mod(r @ public_key[0], q)
vp = pq.integer.mod(np.dot(b, r), q)
v = pq.integer.mod(vp + M * (q // 2), q)
encrypted_msg = (u, v)
In [7]:
Copied!
u, v = encrypted_msg
noisy_m = pq.integer.mod(v - np.dot(secret, u), q)
dist_0 = min(noisy_m, q - noisy_m)
dist_1 = abs(noisy_m - (q // 2))
encrypted_msg = 0 if dist_0 < dist_1 else 1
print(encrypted_msg)
u, v = encrypted_msg
noisy_m = pq.integer.mod(v - np.dot(secret, u), q)
dist_0 = min(noisy_m, q - noisy_m)
dist_1 = abs(noisy_m - (q // 2))
encrypted_msg = 0 if dist_0 < dist_1 else 1
print(encrypted_msg)
1