1. Trang chủ
  2. » Giáo án - Bài giảng

Về một backdoor trong sinh khóa RSA tuân thủ điều kiện “chặt” theo chuẩn FIPS 186-4

7 7 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 283,73 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Để có thể ứng dụng được vào các module mật mã dạng hộp đen hiện có, bài báo tập trung nghiên cứu các thuật toán sinh khóa RSA chứa backdoor và đề xuất một thuật toán sinh khóa R[r]

Trang 1

VỀ MỘT BACKDOOR TRONG SINH KHÓA RSA TUÂN THỦ

ĐIỀU KIỆN “CHẶT” THEO CHUẨN FIPS 186-4

Lê Quang Huy*

Tóm tắt: Bài báo trình bày đề xuất về một thuật toán sinh khóa RSA chứa

backdoor tuân thủ điều kiện “chặt” về tham số khóa theo chuẩn FIPS 186-4 [1] Thuật toán đề xuất dựa trên cơ sở thuật toán tìm số nguyên tố của John Gordon [2]

để tạo số nguyên tố mạnh và tấn công phân tích nhân tử của Coppersmith [3] để giảm lượng thông tin backdoor cần nhúng

Từ khóa: Mật mã, Sinh khóa, RSA, Backdoor

1 ĐẶT VẤN ĐỀ

Hiện nay, Backdoor trong các hệ mật mã được nghiên cứu và công bố rộng rãi Backdoor trong các hệ mật được nghiên cứu chủ yếu tập trung vào phần sinh khóa (key generation) và phần mã mật (encryption) Tuy nhiên, các nghiên cứu đã công bố về backdoor đối với một hệ mật xác định chỉ đề xuất các giải pháp chung trên hệ mật đó chứ chưa đề xuất giải pháp tuân thủ một chuẩn nhất định Với hệ mật RSA, nhiều tổ chức định chuẩn đã công bố các chuẩn ứng dụng trong thực tế Do vậy, để các thuật toán backdoor cho hệ mật RSA có thể ứng dụng được trong thực tế cũng cần thỏa mãn một chuẩn nhất định Hiện tại, chuẩn FIPS 186-4 về chữ ký số là chuẩn mới nhất có bao gồm hệ mật RSA, được nhiều nhà sản xuất các sản phẩm mật mã tuân thủ

Thuật toán sinh khóa chứa backdoor nhằm đảm bảo an ninh, an toàn cho cộng đồng Đối tượng áp dụng là các module mật mã dạng hộp đen Để có thể ứng dụng được vào các module mật mã dạng hộp đen hiện có, bài báo tập trung nghiên cứu các thuật toán sinh khóa RSA chứa backdoor và đề xuất một thuật toán sinh khóa RSA chứa backdoor mới tuân thủ điều kiện “chặt” về tham số khóa tại Appendix B.3.1 FIPS 186-4 [1] Thực hiện mục tiêu trên, bài báo được tổ chức thành 4 phần: Mục 1 - Đặt vấn đề, nêu lên sự cần thiết nghiên cứu; Mục 2 - Các định nghĩa và cơ sở phục vụ cho việc phân tích backdoor; Mục 3 - Đề xuất backdoor mới; Mục 4 - Kết luận tóm tắt các kết quả nghiên cứu và hướng phát triển

2 CÁC ĐỊNH NGHĨA VÀ CƠ SỞ 2.1 Thuật toán sinh khóa chứa backdoor

Định nghĩa về thuật toán sinh khóa chứa backdoor và các thuộc tính có liên quan (tiêu chuẩn đánh giá) trình bày trong phần này sử dụng các kết quả trong [4]

2.1.1 Định nghĩa thuật toán sinh khóa chứa backdoor

Ký hiệu G0, G1 lần lượt là thuật toán sinh khóa trung thực (chuẩn) và thuật toán sinh

khóa chứa backdoor Ký hiệu (k priv , k pub) lần lượt là khóa riêng và khóa công khai được tạo

bởi G0 hoặc G1 Ký hiệu k pub* là khóa công khai hoặc một phần của khóa công khai Ký

hiệu  là tham số an toàn của hệ mật Ký hiệu B0 , B1 lần lượt là sản phẩm hộp đen được

cài đặt thuật toán sinh khóa G0, G1 Ký hiệu R 1 là thuật toán khôi phục cặp khóa được tạo

bởi G1

Định nghĩa: Các cặp khóa được tạo ra bởi G1 là các cặp khóa chứa backdoor an toàn nếu

G1 tạo ra cặp khóa (k pub , k priv) với các thuộc tính sau được thỏa mãn:

1 Tính bảo mật:

a) người thiết kế nhúng một phần khóa riêng vào trong khóa công khai tương ứng, k pub*

Trang 2

Công nghệ thông tin & Cơ sở toán học cho tin học

b) Người dùng, kẻ tấn công không thể tính toán được khóa riêng từ khóa công khai tương ứng, k priv ≠ I -1 ◦ E -1 ◦ M -1 (k pub) (2)

2 Tính hoàn chỉnh: Tồn tại thuật toán R1 , để người thiết kế có thể khôi phục được khóa

riêng từ khóa công khai tương ứng, k priv = R1(k pub ) Hay các hàm M, E, I khả nghịch để người thiết kế tính được k priv = I -1 ◦ E -1 ◦ M -1 (k pub) (3)

3 Khả năng ẩn giấu (khả năng không thể phân biệt được):

a) Đầu ra của B 0 và B 1 không thể phân biệt được về thống kê hoặc về tính toán

b) Các đo đạc bên ngoài B 0 và B 1 không thể phân biệt được một cách rõ ràng

2.1.2 Một số tiêu chuẩn đánh giá thuật toán sinh khóa chứa backdoor

Các tiêu chuẩn đánh giá G1 (mục 5 trong [4]) được tóm tắt trong bảng sau:

Bảng 1 Các tiêu chuẩn đánh giá thuật toán sinh khóa chứa backdoor

Đánh giá

Tiêu chuẩn

Bảo mật l E >= lG1 lG1 >= l E >= lG1 /2 l E < lG1 /2

Hoàn chỉnh ∀ k pub kẻ tấn công k priv

F-1 (k pub) -

∃ k pub kẻ tấn công k priv

= F-1 (k pub)

Lực lượng khóa c >= - ½ -1/2 > c >= -3/2 c < -3/2

Tính phân phối D G1 ≈ 0 D G1 ≈ 0 D G1 > 0

tương quan

Độ phức tạp Tuyến tính (a =< 1 và c

=< 1)

< bậc 2 (2 > a > 1 hoặc 2 > c > 1)

>= bậc 2 (a >= 2 hoặc

c >= 2)

2.3 Một số kết quả về hệ mật RSA

2.3.1 Định lý về số các số nguyên tố

Ký hiệu π(n) là số lượng các số nguyên tố nhỏ hơn hoặc bằng n

Thì khi n lớn, ta có ( ) ~ (4)

Giả sử p là số nguyên tố k bít, số lượng các số nguyên tố k-bit

#{ } = 2 − 2 = ( )

( ) ≈ = ≈ 2 (5) Xác xuất một số nguyên k bít là số nguyên tố:

Pr[ ố à ố ê ố] = ( ) ≈ = 2 = (6)

2.3.2 Định lý Coppersmith (Theorem 4, 5 trong [3] và được chứng minh trong [7])

Trong thời gian đa thức, có thể tìm được phân tích nhân tử của n = p.q nếu biết ¼ log2

n (khoảng ½ độ dài bit của p) các bít thấp (cao) của p

2.3.3 Điều kiện “chặt” về tham số khóa RSA theo FIPS 186-4

Phần này trình bày điều kiện “chặt” về tham số khóa của hệ mật RSA “Chặt” ở đây

được hiểu là yêu cầu cao nhất đối với tham số p và q được mô tả tại phần B1 mục B.3.1

appendix B, FIPS 186-4

Ký hiệu khóa công khai (n, e), khóa riêng (n, d), n = p.q, với p, q là các số nguyên tố

Ký hiệu nlen là độ dài theo bit của n Các tham số thỏa mãn điều kiện sau:

1 p và q là những số nguyên tố được tạo ngẫu nhiên thỏa mãn điều kiện:

Trang 3

- p, q là các số nguyên tố chứng minh được

- p1, p2, q1, q2 lần lượt là nhân tử nguyên tố của các số (p - 1), (p + 1), (q - 1), (q + 1), (các số nguyên tố phụ của p, q) là các số nguyên tố có thể chứng minh được

- Ký hiệu n1, n2, n3, n4 lần lượt là chiều dài theo bit của p1, p2, q1, q2 Chiều dài của các

số nguyên tố phụ tuân thủ các ràng buộc trong bảng 2

Bảng 2 Chiều dài tối thiểu và tối đa của p 1 , p 2 , q 1 và q 2

p1, p2, q1, q2

Chiều dài tối đa của

len(p1) + len(p2) và len(q1) + len(q2)

1024 > 100 bits > nlen/16 = 64 < 239 bits = nlen/4 - 17

2048 > 140 bits > nlen/16 = 128 < 494 bits = nlen/4 - 18

3072 > 170 bits < nlen/16 = 192 < 750 bits = nlen/4 - 18

2 e được chọn trước khi tạo p, q; e là một số lẻ thỏa mãn: 216 < e < 2256

3 Các số nguyên tố p và q thỏa mãn các ràng buộc sau:

a) (p - 1), (q - 1) nguyên tố cùng nhau với số mũ công khai e

b) √2 2 / ≤ , ≤ 2 / − 1 (7)

c) | − | > 2 / (8)

4 Số mũ riêng d, được tạo sau khi tạo p và q, thỏa mãn:

2nlen / 2 < d < LCM (p - 1, q - 1) và d = e-1 mod (LCM (p - 1, q - 1))

2.3.4 Thuật toán sinh khóa RSA tuân thủ điều kiện 2.3.3 (thuật toán G 0 )

Các số nguyên tố p, q được tạo dựa trên cơ sở của thuật toán tìm số nguyên tố mạnh của John Gordon [2], các số nguyên tố phụ p1, p2, q1, q2 được tạo dựa trên thuật toán sinh

số nguyên tố chứng minh được của Maurer ([6]) Giá trị B p , B q được tính dựa theo định lý phần dư Trung Hoa (CRT)

Input: nlen, n1, n2, n3, n4

Output: p, q, n, e, d

// generate e

1 e = RandomOddInteger(216, 2256)

// generate p

2 p1 = RandomProvablePrime(2 , 2 )

3 p2 = RandomProvablePrime (2 , 2 )

4 A p = p1.p2.

5 = 1

−1 // using CRT

6 S p = { A p i + B p } (i = 1, 2, 3, …)

7 =

∩ √2 2 / , 2 / − 1

such that gcd(p - 1, e) = 1

// generate q

8 q1 = RandomProvablePrime(2 , 2 )

9 q2 = RandomProvablePrime(2 , 2 )

10 A q = q1.q2

11 = 1

−1 //using CRT

12 S q ={ A q j + B q } (i = 1, 2, 3, …)

13 =

∩ √2 2 / , 2 / − 1

such that gcd(q - 1, e) = 1

14 if ( |p – q| ≤ 2 nlen/2 – 100) then go to step 8

// compute n, d

15 n = p.q

16 d = e–1 mod (LCM(p - 1, q - 1))

17 if ( d < 2 nlen/ 2 ) then go to step 8

18 return (p, q, n, e, d)

2.3.5 Lực lượng khóa của thuật toán sinh khóa RSA tuân thủ điều kiện 2.3.3

Số lượng phần tử e, #{ e }= (2256- 216)/2 = (2255- 215) ≥ 2254 (e là số lẻ)

Xét cách tạo p: Vì p1 , p2 là các số nguyên tố thỏa mãn điều kiện tại bảng 1 nên ước

lượng chiều dài theo bit của p1 , p2 : (nlen/16) ≤ log2 p1 , log2 p2 ≤ (nlen/8 - 9)

Trang 4

Công nghệ thông tin & Cơ sở toán học cho tin học

Tập S p được tạo bởi p1 và p2 theo thuật toán sinh số nguyên tố chứng minh được của Maurer Số lượng số nguyên tố được sinh bởi thuật toán của Maurer sau vài mức đệ quy đạt khoảng 10% trong tất cả các số nguyên tố (mục 3.4 trong [6])

Vậy số lượng các số nguyên tố p1 và p2 = {10% các số nguyên tố (2nlen/16, 2nlen/8-9)}≈ 1/8 * các số nguyên tố (2nlen/16

, 2nlen/8-9)

#{ } = #{ } = 2 2 − 2 = 2 /

= 2 / . / ( ). /

/ = / (9)

Vì p là một số nguyên tố nằm trong tập Sp và nằm trong khoảng

√2 2 / , 2 / − 1 Ký hiệu s ∈ Sp , ta có s = Ap.i + Bp, (bước 6), Ta có

√2 2 / < + < 2 / − 1 ⇔ √ / ≤ ≤ / ⇔

⇒ #{ } = #{ } = / √ / / = ( √ ). / / ⇔ ( √ )./ / =

2 0,6 2 / ≈ 2 2 / = 2 /

Vậy # Sp với mỗi một cặp giá trị p1, p2 là: 2 / (10) Vậy số lượng các số nguyên có thể được tạo ra bởi tập Sp,

# Sp = #{p1} #{p2}.#{i} =

/ / 2 / = / Theo (6), ta có Pr[ ố à ê ố] =

Số lượng số nguyên tố p, #{p} = / .

/ = / (11) Xét cách tạo q: Theo (9), ta có: #{ } = #{ } = /

Ký hiệu u là một số nguyên tố và v là một số nguyên; (u, v ∈ S q ) và (u, v ∈ {ngoài

khoảng điều kiện (8)} ⇔ {p - 2nlen/2 -100 ≤ u, v ≤ p + 2nlen/2 -100} (12))

Vì v ∈ S q , nên v = A q j + B q , do vậy

p - 2nlen/2 -100 ≤ A q j + B q ≤ p + 2nlen/2 -100 ⇔ /

. ≤ ≤ /

.

#{ } = + 2

/ − ( − 2 / )

2 / =2 2

/

2 / = 2 /

Vậy #{v} = #{q1} #{q2}.#{j} =

/ / 2 / = /

#{u} = #{v} Pr[số k bit là số nguyên tố] = /

Vì q được tạo giống như p và sau p thỏa mãn điều kiện (8), nằm ngoài khoảng (12), mà

giá trị khoảng (12) có giá trị: (p + 2nlen/2 -100 – (p - 2nlen/2 -100) = 2nlen/2 -99) nhỏ hơn rất

nhiều so với khoảng tồn tại của p và q (điều kiện (7)) với giá trị là :

(2 − √2) 2 / ≈ 0,6 2 / Nên #{q} = #{p} - #{u} =

/

− / > / (13)

Vậy lực lượng khóa của thuật toán là, #{(p, q, d, e)} = #{e}.#{(p}.#{q)}

Trang 5

= 2254

/ / = 2254 (14)

3 ĐỀ XUẤT THUẬT TOÁN SINH KHÓA RSA CHỨA BACKDOOR MỚI 3.1 Giới thiệu thuật toán đề xuất

Thuật toán đề xuất sử dụng ý tưởng của thuật toán tìm số nguyên tố mạnh của John Gordon [2] thỏa mãn các điều kiện tại 2.3.3, để cài thông tin backdoor vào một nửa các bit

thấp của p Thông tin backdoor được mã mật hóa (hoặc băm) bởi hàm F K Giá trị p được

khôi phục thông qua thuật toán của Coppersmith [3]

Các tham số thuật toán:

+ G1 = Thuật toán đề xuất; I(k priv) = ((p⌋k/2)⌋); E = F K = AES,

E = log2 n = nlen, k(E) = (K); M = n; log2 p = log2 q = nlen/2

+ Hàm G: {0, 1} 2k x {0, 1}k/2 x {0, 1} k/2 → {0, 1}k, hàm này thực hiện kết quả của định

lý Coppersmith (mục 2.3.2), ví dụ: p = G(n, 2 k/2 , p mod 2 k/2 ); (nlen = 2k)

+ Giá trị B p , B q: có thể được tính thông qua định lý phần dư Trung Hoa (CRT)

+ Giá trị m là một ngưỡng để chọn giá trị ngẫu nhiên t không quá lớn để có thể dò tìm

lại trong thuật toán khôi phục khóa

Thuật toán đề xuất: Sinh khóa RSA

Input: nlen, n1, n2, n3, n4, m

Output: p, q, n, e, d

// generate e

1 e = RandomOddInteger(216, 2256)

2 u = F K (e) //encryption or hash with

key

3 t = Random(m) // t < m

4 C = u t mod 2 nlen/4

// generate p

5 p1 = RandomProvablePrime(2 , 2 )

6 p2 = RandomProvablePrime (2 , 2 )

7 A p = p1.p2 2nlen/4

8 =

1

−1

2 /

// using CRT

9 S p = { A p i + B p } (i = 1, 2, 3, …)

10 =

∩ √2 2 / , 2 / − 1

such that gcd(p - 1, e) = 1

// generate q

11 q1 = RandomProvablePrime(2 , 2 )

12 q2 = RandomProvablePrime(2 , 2 )

13 A q = q1.q2

14 = 1

−1 //using CRT

15 S q ={ A q j + B q } (i = 1, 2, 3, …)

16 =

∩ √2 2 / , 2 / − 1

such that gcd(q - 1, e) = 1

17 if ( |p – q| ≤ 2 nlen/2 – 100) then go to step

11

// compute n, d

18 n = p.q

19 d = e–1 mod (LCM(p - 1, q - 1))

17 if ( d < 2 nlen/ 2 ) then go to step 11

18 return (p, q, n, e, d)

Thuật toán đề xuất: khôi phục khóa RSA

Input: n, e, m

Output: p, q, d

1 t = 1, C = 1

2 u = F K (e)

3 repeat

4 C = C.u mod 2 nlen/4

//(C = u t mod 2 nlen/4)

5 if C mod 2 = 1 then

6 p = G(n, 2 nlen/4 , C) //Coppersmith (2.3.2)

8 until (p mod 2 nlen/4 = C) and (p is prime) and (t < m)

9 q =n / p;

10 d = e–1 mod (LCM(p - 1, q - 1))

11 return (p, q, d)

3.2 Đánh giá thuật toán đề xuất

Trang 6

Công nghệ thông tin & Cơ sở toán học cho tin học

Tính bảo mật: Tính bảo mật được đánh giá ở mức tốt vì người thiết kế sử dụng hệ mật đối

xứng, hoặc hàm băm có khóa với độ dài tham số an toàn tương đương với độ dài tham số

an toàn của người dùng

Tính hoàn chỉnh: Tính hoàn chỉnh được đánh giá ở mức tốt Với thuật toán đề xuất người

thiết kế luôn tính được khóa riêng từ khóa công khai tương ứng và kẻ tấn công không thể

tính toán được khóa riêng, từ khóa công khai của người dùng

Lực lượng khóa:

Xét việc tạo p (bước 5 đến 10) Theo (9), ta có #{ } = #{ } ≈ /

Ký hiệu s ∈ Sp , ta có s = A p i + B p , (bước 9) và #{ s } = #{ i }

≤ / ⇔ √ //

.

/ / ≤ ≤ / /

⇒#{ } = / √ / / = ( √ )./ / = ( √ )./ / = 2 0,6 ≈ 2 Vậy số lượng các số nguyên của bởi tập Sp,

# Sp = #{p1} #{p2}.#{i } = / / 2 = / Theo (6), ta có Pr[ ố à ê ố] = ,

Vậy số lượng p, #{p}= # Sp Pr[số k bit là nguyên tố] = /

/ = / (15)

Xét cách tạo q, vì q được tạo giống như q trong thuật toán mục 2.3.4, độc lập với p và

thỏa mãn điều kiện (8) Theo (13), vậy #{ } ≈ / (16)

Cách tạo d, cũng giống như trong thuật toán mục 2.3.4

Xét tỷ lệ giữa lực lượng của G1 và G0, vì e, q, d được sinh trong G1 giống như trong G0

nên hạng tử #{e}, #{q} có thể bỏ qua, nên tỷ lệ lực lượng giữa G1 và G0 là:

= , , ≈ // /

/ = 2 / = 2 . (17)

Vì hằng số c = -1/2 trong tỷ lệ giữa hai lực lượng, , nên theo bảng 1, lực lượng của

G1 được đánh giá ở mức tốt

Tính chất phân phối: Thông tin backdoor được tạo ngẫu nhiên và được nhúng vào các bit

thấp của p nên phần nhúng thông tin backdoor cũng có phân phối gần với phân phối đều Việc sinh p, q ngẫu nhiên nên phân phối của n có thể gần với phân bố đều và do vậy, khoảng cách thống kê giữa thành phần n của G1 và G0 là xấp xỉ bằng 0, DG1 ≈ 0 Vậy tính

chất phân phối của G1 được đánh giá là tốt

Tương quan giữa các thành phần khóa: Thông tin backdoor đựợc nhúng vào tham số p

Theo cách thực hiện của thuật toán tham số q được tạo độc lập Nếu người dùng cố định p hoặc q và yêu cầu sinh lại q hoặc p thì có thể thực hiện được Do vậy, tính tương quan giữa các thành phần khóa của G1 được đánh giá đạt mức tốt

Độ phức tạp tính toán:

Vì p được tạo gần giống như trong G0 (chỉ khác A, B) nên ta có t p (G0) = t p (G1)

Việc tạo e, q, d giống như trong G0 nên độ phức tạp tạo n là: t n (G1) = t p + t q = t n và độ

phức tạp tạo e là: t e (G1) = t e (G0)

Trang 7

Vậy độ phức tạp của thuật toán là: T(G1) = t n + t e Nên độ phức tạp của G1 được đánh giá

là “tốt” vì nó khác biệt không đáng kể đối với độ phức tạp của G0

Bộ nhớ sử dụng: Thuật toán không sử dụng bộ nhớ NM và VM nên nó có thuộc tính bộ

nhớ sử dụng được đánh giá là tốt

4 KẾT LUẬN

Dựa trên thuật toán sinh số nguyên tố chứng minh được của Maurer và thuật toán tìm

số nguyên tố mạnh của John Gordon và tấn công phân tích nhân tử của Coppersmith, một thuật toán sinh khóa RSA chứa backdoor mới thỏa mãn các điều kiện chặt theo chuẩn FIPS 186-4 được đề xuất Thuật toán đề xuất được đánh giá tốt trên 7 thuộc tính và có thể ứng dụng tốt trong phần sinh khóa của thiết bị PKI Token hoặc HSM (Hardware Security Module) Ngoài ra, thuật toán có thể được xem xét cải tiến theo hướng tăng lực lượng khóa hoặc rút bớt thông tin backdoor

TÀI LIỆU THAM KHẢO

[1] FIPS, 2013, FIPS PUB 186-4; Digital Signature Standard,

http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf

[2] John Gordon, 1985, Strong Primes are Easy to Find In: Beth T., Cot N., Ingemarsson

I (eds) Advances in Cryptology

[3] D Coppersmith, 1995, Small Solutions to Polynomial Equations, and Low Exponent

RSA Vulnerabilities, https://www.di.ens.fr/~fouque/ens-rennes/coppersmith.pdf

[4] G.Arboit, 2008, Two mathematical security aspects of the rsa cryptosystem,

http://crypto.cs.mcgill.ca/~crepeau/PDF/these-Genevieve.pdf

[5] A Menezes, P van Oorschot, and S Vanstone, 2001, Handbook of Applied

Cryptography, CRC Press

[6] U Maurer, 1994, Fast Generation of Prime Numbers and Secure Public Key

Cryptographic Parameters, https://pdfs.semanticscholar.org/e

[7] Alexander May, 2007, Using LLL-Reduction for Solving RSA and Factorization

Problems, https://pdfs

ABSTRACT

A BACKDOOR IN RSA KEY GENERATION STRICTLY COMPLY WITH FIPS 186-4

In this paper, a proposal of backdoored RSA key generation algorithm strictly comply with conditions of key parameter in FIPS 186-4 [1] is presented The proposed algorithm use John Gordon’s strong prime finding algorithm [2] and using Coppersmith’s factoring attack [3] to reduce backdoor information for embedding

Keywords: Cryptography, Key generation, RSA, Backdoor

Nhận bài ngày 24 tháng 7 năm 2017 Hoàn thiện ngày 13 tháng 10 năm 2017 Chấp nhận đăng ngày 20 tháng 12 năm 2017

Địa chỉ: Cục Chứng thực số và Bảo mật thông tin - Ban Cơ yếu Chính phủ

* Email : lequanghuyabc@gmail.com.

Ngày đăng: 01/04/2021, 14:18

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w