Cho $G \neq \emptyset$, định nghĩa phép toán $\cdot: G \times G \rightarrow G$
$(G, \cdot)$ là một nhóm (Group) nếu:
$G$ là nhóm giao hoán (Nhóm Abel) nếu thỏa thêm điều kiện
Cho $g \in G \equiv \mathbb{Z}^{*}_p, x \in \mathbb{Z}, y \equiv g^x \pmod{p}$. Khi đó bài toán tìm $x$ là một bài toán DLP.
Ví dụ: Xét nhóm $\left(\mathbb{Z}^{*}_7, \cdot_7\right)$ (tạm hiểu $\cdot_7$ là phép mũ $7^x\ \forall x \in \mathbb{Z}^{*}_7$)
Với $2 \in \mathbb{Z}^{*}_7$, tập các giá trị có thể có là ${1, 2, 4}$:
Với 3 thì khác, tập giá trị có thể có là ${1, .., 6}$.
Gọi $\text{ord}\left(g\right)$ là bậc của $g \in G$. Đặt $\left|G\right| = n$, nếu $\text{ord}\left(g\right) = n - 1$ thì $g$ là một phần tử sinh của $G$.
Thuật toán phía dưới tìm nhanh các phần tử sinh của $n$.
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 $p$ là một số nguyên tố có dạng $p = 2q + 1$ (như ta đã tạo trong RSA) $\Rightarrow (p - 1)$ không phải là một số nguyên tố.
Ta có thể biểu diễn $(p - 1) = s_1^{e_1}s_2^{e_2}..s_m^{e_m} (e_i \geq 1)$. Thuật toán tìm nhanh phần tử sinh được miêu tả như sau:
$\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.
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.
Khi đó khóa $k$ để mã hóa & giải mã được tính như sau: $k \equiv k_B^x \equiv k_A^y \pmod p$
Phía người gửi tính $c \equiv mk \pmod p$
Phía người nhận tính $m \equiv ck^{-1} \pmod p$
Giả sử Alice gửi mã và Bob giải mã, vậy Bob sẽ là người tạo khóa.
Người nhận giải mã bằng cách tính $m \equiv (c_1^d)^{-1}c_2 \pmod p$
Chú ý: Chọn $p$ quá nhỏ sẽ dẫn đến trường hợp encrypt ra các kí tự bị collision.
Các thuật DLP dựa vào độ khó của bài toán logarithm rời rạc (i.e cho $g, h, p$, tìm $x$ sao cho $g^x \equiv h \pmod p$). Giải bài toán logarithm rời rạc, thường dùng là thuật toán Index Calculus.
$n \in \mathbb{Z}$ là một số $B$-smooth khi và chỉ khi $\displaystyle n = \prod_{p_i \in \mathbb{P}} p_i (p_i \leq B)$ (với $\mathbb{P}$ là tập các số nguyên tố).
Cho $g^x \equiv h \pmod p, g, p$. Tìm $x$?
$\displaystyle \iff hg^{-k} = \prod_{p_i \in \mathbb{P}} p_i^{e_{p_i}} \pmod p\ (p_i \leq B) \ \iff \log_{g}h = k + \sum_{p_i \leq B} e_{p_i} \log_{g} p_i \pmod p $
Giải phương trình đồng dư $6^x = 57 \pmod{107}$
Điều này tương đương với
\[\begin{cases} 24 \equiv \log_{6}2 + \log_{6}3 + \log_{6}7 \pmod{107}\\ 6 \equiv 2\log_{6}2 \pmod{107}\\ 33 \equiv \log_{6}3 + \log_{6}5 \pmod{107}\\ 34 \equiv \log_{6}2 + 2\log_{6}3 + \log_{6}5 \pmod{107} \end{cases}\]Lần lượt đặt $\log_{6}2 = a, \log_{6}3 = b, \log_{6}5 = c, \log_{6}7 = d$, ta có hệ 4 phương trình 4 ẩn. Giải hệ phương trình, ta thu được các nghiệm
\[\begin{cases} a = \log_{6}2 = 3\\ b = \log_{6}3 = 104\\ c = \log_{6}5 = 35\\ d = \log_{6}7 = 23 \end{cases}\](Chú ý đây không phải phép logarit thông thường!)
Chọn $u = 38 \Rightarrow hg^u \equiv 35 = 5\times7 \pmod{107}$
Lấy logarithm 2 vế cho $6$:
$\log_{6}(57\times 6^{38}) = \log_{6}5\times \log_{6}7 \iff \log_{6}57 + 38 = \log_{6}5 + \log_{6}7$. Mà $6^x \equiv 57 \pmod{107} \Rightarrow x \equiv \log_{6}57 = \log_{6}5 + \log_{6}7 - 38 = 35 + 23 - 38 = 20$.
Nhóm $(\mathbb{G}, +)$ là nhóm các điểm nằm trên đường cong Elliptic $(E): y^2 = x^3 + ax + b$ với:
Hình bên dưới là biểu diễn của đường cong Elliptic $(E): y^2 = x^3 - x + 1, P = (1, -1), Q = (0, -1), R = P + Q$.
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()