Cho
- Tiên đề đóng:
$\forall a, b \in G: a\cdot b \in G$ -
$G$ có phần tử đơn vị:$\exists e \in G: e\cdot a = a\cdot e = a, \forall a \in G$ -
$G$ có phần tử nghịch đảo:$\exists a, e \in G: \exists a^{-1} \in G: a \cdot a^{-1} = a^{-1} \cdot a = e$ -
$G$ có tính kết hợp:$\forall a, b, c \in G: (a \cdot b) \cdot c = a \cdot (b \cdot c)$
$\forall a, b \in G: a\cdot b = b\cdot a$
Cho
Với
$2^0 \equiv 1 \pmod 7$ $2^1 \equiv 2 \pmod 7$ $2^2 \equiv 4 \pmod 7$ -
$2^3 \equiv 1 \pmod 7$ (quay lại ban đầu) ..
Với 3 thì khác, tập giá trị có thể có là
Thuật toán phía dưới tìm nhanh các phần tử sinh của
def naive_generator_list(n):
result = []
for i in range(2, n):
is_generator = True
power = 1
generated = []
while 1:
m = (i ** power) % n
if (m not in generated):
generated.append(m)
else: break
power += 1
if len(generated) != n - 1: is_generator = False
if is_generator: result.append(i)
return result
print('Generators of Z_11: ', naive_generator_list(11))
print('Generators of Z_13: ', naive_generator_list(13))
print('Generators of Z_17: ', naive_generator_list(17))
Generators of Z_11: [2, 6, 7, 8]
Generators of Z_13: [2, 6, 7, 11]
Generators of Z_17: [3, 5, 6, 7, 10, 11, 12, 14]
Cho
Ta có thể biểu diễn
-
Lấy random một số nguyên
$x \in (2, p)$ -
$\forall s_i \in [1, m]$ :Nếu
$x^{\frac{(p - 1)}{s_i}} \equiv 1 \pmod p$ thì$x$ không phải là phần tử sinh của$p$ , trở lại bước 1. -
$x$ là một phần tử sinh, return x.
Thuật toán trình bày bên dưới.
import random
from functools import reduce
# For consistent output
random.seed(42)
def factors(n):
return set(reduce(list.__add__,
([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))
def find_random_generator(n):
while 1:
x = random.randrange(2, n)
is_generator = True
for i in factors(n - 1):
if i == 1: continue
k = (n - 1) // i
if (x ** k) % n == 1:
is_generator = False
break
if is_generator: return x
print(find_random_generator(11))
print(find_random_generator(13))
print(find_random_generator(17))
2
6
5
Điểm chính: thống nhất 1 bí mật chung giữa người gửi và người nhận.
- Tạo ngẫu nhiên
$p$ là một số nguyên tố có độ an toàn$\lambda$ . - Chọn
$g$ là một phần tử sinh của$p$ .
-
Phía người gửi:
- Chọn ngẫu nhiên
$x \in (2, p)$ . - Tạo khóa
$k_A \equiv g^x \pmod p$ - Gửi khóa
$k_A$ cho người nhận.
- Chọn ngẫu nhiên
-
Phía người nhận:
- Chọn ngẫu nhiên
$y \in (2, p)$ . - Tạo khóa
$k_B \equiv g^y \pmod p$ - Gửi khóa
$k_B$ cho người gửi.
- Chọn ngẫu nhiên
Khi đó khóa
Phía người gửi tính
Phía người nhận tính
Giả sử Alice gửi mã và Bob giải mã, vậy Bob sẽ là người tạo khóa.
-
Phía người nhận: 0. Chọn
$p, g$ như Pha 0 bên trên.- Chọn ngẫu nhiên
$d \in (2, p)$ . - Tính khóa mã
$e \equiv g^d \pmod p$ - Gửi bộ
$p, g, e$ cho người gửi.
- Chọn ngẫu nhiên
-
Phía người gửi: 0. Nhận
$p, g, e$ .- Chọn ngẫu nhiên
$x \in (2, p)$ . - Tính
$c_1, c_2$ :
$c_1 \equiv g^x \pmod p$ $c_2 \equiv me^x = mg^{dx} \pmod p$
- Gửi
$c = (c_1, c_2)$ cho người nhận.
- Chọn ngẫu nhiên
Người nhận giải mã bằng cách tính
Chú ý: Chọn
Các thuật DLP dựa vào độ khó của bài toán logarithm rời rạc (i.e cho
Cho
- Giải
$g^x \equiv l \pmod p\ (l \leq B)$ - Tìm
$k$ sao cho$hg^{-k}$ là một số$B$ -smooth
Giải phương trình đồng dư
- Chọn
$B = 7 \Rightarrow \mathbb{B} = {2, 3, 5, 7}$ - Thử-và-sai nhiều lần:
- Chọn
$k = 24 \Rightarrow 6^k \equiv 42 \pmod{107} = 2\times3\times7$ - Chọn
$k = 6 \Rightarrow 6^k \equiv 4 \pmod{107} = 2^2$ - Chọn
$k = 33 \Rightarrow 6^k \equiv 15 \pmod{107} = 3\times5$ - Chọn
$k = 34 \Rightarrow 6^k \equiv 90 \pmod{107} = 2\times3^2\times5$
Điều này tương đương với
Lần lượt đặt
(Chú ý đây không phải phép logarit thông thường!)
- Tiếp tục thử-sai nhiều lần: chọn
$u$ sao cho$hg^u$ là một số$B$ -smooth
Chọn
Lấy logarithm 2 vế cho
Nhóm
$\mathbb{G} = {P(x, y) \in (E), \forall x, y \in \mathbb{Z}_p}$ - $+:\mathbb{G} \times \mathbb{G}\to \mathbb G,; P + Q\mapsto R $ (Chọn 2 điểm
$P, Q \in (E)$ , đường thẳng đi qua$P, Q$ cắt$E$ tại điểm thứ 3 là$Z$ . Lấy$R$ là đối xứng của$Z$ qua$Ox$ ). - Nếu
$P$ và$Q$ không cắt$(E)$ ở điểm thứ 3 thì$P + Q = O$ với$O$ là điểm vô cực.
Hình bên dưới là biểu diễn của đường cong Elliptic
import numpy as np
import matplotlib.pyplot as plt
a = -1
b = 1
y, x = np.ogrid[-5:5:100j, -5:5:100j]
plt.figure(figsize=(20, 10))
plt.contour(x.ravel(), y.ravel(), pow(y, 2) - pow(x, 3) - x * a - b, [0])
plt.grid()
plt.scatter(1, -1)
plt.annotate('P', (1, -1), size = 20)
plt.scatter(0, -1)
plt.annotate('Q', (0, -1), size = 20)
plt.axhline(y = -1)
plt.scatter(-1, -1)
plt.annotate('Z', (-1, -1), size = 20)
plt.scatter(-1, 1)
plt.annotate('R', (-1, 1), size = 20)
plt.show()
- Chọn
$p \in \mathbb{P}$ và$(E)$ là một đường cong Elliptic; Chọn$G \in (E)$ . - Chọn
$d$ ngẫu nhiên,$e = dG = G + G + .. + G$ ($d$ lần). - Pha mã hóa: chọn
$y$ ngẫu nhiên,$c_1 = yG, c_2 = M + ye$ ($M$ là tin cần mã hóa). - Pha giải mã:
$M = c_2 - dc_1$ .