1. Trang chủ
  2. » Luận Văn - Báo Cáo

hàm băm mật mã và mô hình random oracle

25 477 3

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 25
Dung lượng 1,3 MB

Nội dung

hàm băm mật mã và mô hình random oracle

HỌC VIỆN KỸ THUẬT QUÂN SỰ KHOA CÔNG NGHỆ THÔNG TIN O0O BÀI TẬP MÔN LÝ THUYẾT MẬT MÃ VÀ BẢO MẬT THÔNG TIN Tên đề tài: Hàm băm mật mã và mô hình random oracle Giáo viên hướng dẫn: PGS. TS Nguyễn Hiếu Minh 1 MỤC LỤC Lời giới thiệu I. Mô hình random oracle ượớệở !"#"ộ ọ$ưởộ% 1. Tổng quan về mô hình 2. Nguyên lý lồng chim Nếu có n lồng chim bồ câu chứa n+1 con chim bồ câu, thì ít nhất một lồng chim có chứa 2 con chim. Theo nguyên tắc lồng chim bồ câu nếu có n lồng chim 2 thì chứa kn+1 con chim, vậy nếu có n lồng chim bồ câu thì ít nhất một lồng chứa k+ 1 con chim. Giả sử rằng các thông điệp trong một hàm băm là chiều dài 6 bit và bản rút gọn (digest) chỉ còn 4 bit. Sau đó, số lượng có thể của digest (pigeonholes) là 24 = 16, và số lượng có thể của thông điệp (bồ câu) là 26 = 64. Điều này có nghĩa là n = 16 và kn + 1 = 64, do đó k là lớn hơn 3. Kết luận là có ít nhất một digest tương ứng với bốn (k + 1) thông điệp. 3. Bài toán ngày sinh Nếu kích thước của hàm Hash nhỏ, thì có thể tìm được 2 văn bản có cùng giá trị hàm băm, tức là có va chạm mà không phụ thuộc vào số lượng biến đổi của hàm, cách tấn công này có tên ngày sinh nhật. Ý tưởng của phương pháp tấn dựa trên bài toán ngày sinh nhật sau. Cần phải chọn một nhóm bao nhiêu người để xác suất hai người có cùng ngày sinh nhật là 0.5? Vấn đề ở chổ là xác suất trùng ngày sinh nhật đối với một cặp ngẫu nhiên là p’=1/365, còn trong nhóm gồm n người có 2 2/)1( nnn ≈− cặp khác nhau. Từ đây dể dàng nhận được đánh giá gần đúng. Xác suất để tồn tại ít nhất một cặp có cùng ngày sinh là 2/' 2 npp = , từ đây p=1/2 thì chúng ta thu được '/1 pn ≈ . Chúng ta xem sử dụng bài toán ngày sinh nhật để tìm va chạm trong hàm Hash như thế nào. Giả sử cho H là hàm Hash với kích thước đầu ra là m bít. Chúng ta có N bản tin khác nhau NiM i 1, )( = , tính toán giá trị băm của các bản tin này, giá trị tương ứng 3 là )(i H . Nếu như hàm Hash là hàm biến đổi giả ngẫu nhiên thì dễ dàng tính được xác suất sao cho giữa N giá trị )(i H không tìm được hai như nhau. Đầu tiên chúng ta xem đánh giá dựa trên tính toán gần đúng, sao cho số lượng va chạm là đủ nhỏ. Chúng ta chọn một số giá trị )1( H . Xác suất để nó không trùn với các phần còn lại là 1)1( )21( −− −≈ Nm P . Tiếp tục chọn một số giá trị mới )2( H . Xác suất để nó không trùng với phần còn lại là 2)2( )21( −− −≈ Nm P . Chúng ta chọn tương tự như vậy đối với giá trị mới của hàm Hash, trong bước thứ I chúng ta thu được xác suất không trùng là iNmi P −− −≈ )21( )( Tất cả chúng ta cần thực hiện N-1 bước kiểm tra không trùng. Xác suất để không một giá trị trong chúng không trùng là: ∑ −=−⋅⋅−⋅⋅−⋅−≈ −−−−−−−− )21()21( )21( )21()21( 21' mmiNmNmNm P Với ∑ −=−+++= 2/)1()1( 21 NNN . Xác suất tìm thấy va chạm là ∑ −−−− ⋅≈⋅−−≈ ∑ −−=−= 12 2)21(1)21(1'1 mmm Npp . Với xác suất va chạm là ½ thì ta có biểu thức: 2/12 12 =⋅ −−m N , Từ đây chúng ta xác định gía trị N 1/2 : m N 2 2/1 ≈ . Chúng ta xem tính cách tính chính xác hơn xác suất tìm va chạm trong tập hợp NiH i 1, )( = , có thể nhận được bằng cách rất đơn giản sau. Chúng ta chọn )2( H . Xác suất để )2( H không trùng )1( H là )21( )2( m p − −= . Tiếp tục chọn )3( H . Xác suất để )3( H không trùng với )2( H và )1( H , với điều kiện )1( H và )2( H không trùng nhau là )221)(21( )3( mm p −− ⋅−−= . Một cách tương tự, chúng ta xác định xác suất )(N p để )(N H không trùng với một trong các giá trị )1( H , )2( H ,…, )1( −N H , với điều kiện là các giá trị )1( H , )2( H ,…, )1( −N H khác nhau từng đôi một. Chúng ta nhận được 4 ]2)1(1[ )1()3()2()( mNN Npppp −− ⋅−−⋅⋅⋅⋅= . Như vậy giá trị chính xác của xác suất không có sự va chạm là: ∏ − = −−−−− ⋅−=⋅−−⋅⋅⋅−−⋅⋅⋅−⋅−== 1 1 )( )21(]2)1(1[ ]2)1(1[ )221()21(' N i mmmmmN iNipp . Từ đây chúng ta xác định xác suất có sự va chạm là p=1-p’. Áp dụng công thức gần đúng x ex − ≈−1 . Chúng ta thu được: ]2)1(exp[)2exp()2exp()21(' 1 1 1 1 1 1 1 −− − = − − = − − = − ⋅−−=⋅−=⋅−≈⋅−= ∑ ∏∏ m N i m N i m N i m NNiiip . Xac suất tồn tại ít nhất một va chạm là: ]2)1(exp[1'1 1−− ⋅−−−=−≈ m NNpp . Từ đây ta dể dạng nhận được điều sau:         − ≈+ + p NN m 1 1 ln2 12 , Hay         − ≈ + p N m 1 1 ln2 12 ,         − ≈ + p N m 1 1 ln2 1 . Với p=1/2 chúng ta có m N 217.1 2/1 ≈ . Chúng ta thấy kết quả ở phương án tính này chính xác hơn phương án đầu tiên. Và từ công thức này chúng ta thấy, trong số 23 người chọn ngẫu nhiên thì có ít nhất một cặp trùng ngày sinh với xác suất là ½. Như vậy để thực hiện tấn công thì cần bộ nhớ là m m 2/ 217.1 ⋅ bít và cần thực hiện 2/ 217.1 m ⋅ tính toán hàm Hash và thực hiện sắp xếp 2/ 217.1 m ⋅ số. Và từ đây chúng thấy rằng nếu như m không đủ lớn thì sẽ dễ dàng tìm ra được số lượng bản tin mà có sự va chạm. Với công nghệ hiện nay thì đòi hỏi 128≥m bít. 4. Tấn công trên mô hình random oracle Hàm băm được xem là hàm một chiều khi cho trước giá trị băm, không thể tái tạo lại thông điệp ban đầu, hay còn gọi là “tiền ảnh” (“pre-image”). Như vậy, trong trường hợp lý tưởng, cần phải thực hiện hàm băm cho khoảng 2 n thông điệp để tìm ra được “tiền ảnh” tương ứng với một giá trị băm. Nếu tìm ra được một phương pháp tấn công cho phép xác định được “tiền ảnh” tương ứng với một giá trị băm cho trước thì thuật toán băm sẽ không còn an toànnữa. 5 Cách tấn công nhằm tạo ra một thông điệp khác với thông điệp ban đầu nhưng có cùng giá trị băm gọi là tấn công “tiền ảnh thứ hai” (second pre-image attack). Hình Tiêu chuẩn của hàm băm mật mã Cách tấn công Tiền ảnh 1: Giả sử y = h(M) , tìm M’ sao cho y = h(M’) Trong đó: M: là Thông điệp H : là hàn băm H(M): là bản thông điệp rút gọn 5. Tấn công trên cấu trúc II. Hàm băm mật mã Hình Mô hình tấn công tiền ảnh 1 Thuật toán: Tiềm ảnh 1 Preimage_Attack(D) { For (i = 1 to k) { Create (M[i]) T ← h(M[i]) If (T = D) return M[i] } Return failure } Những khó khăn của một cuộc tấn công tiền ảnh 2 có tỉ lệ với 2 n Một hàm băm mật mã sử dụng một digest của 64 bit. Có bao nhiêu digest không Eve cần tạo để tìm ra thông báo ban đầu với xác suất hơn 0,5? Số lượng digest được tạo ra là k ≈ 0,69 × 2n ≈ 0,69 × 264. Đây là một số lượng lớn. Ngay cả khi Eve có thể tạo ra 230 (gần một tỷ đồng) tin nhắn mỗi thứ hai, nó mất 0,69 × 234 giây hoặc hơn 500 năm. Điều này có nghĩa rằng một thông điệp tiêu hóa của kích thước 64 bit là an toàn đối với preimage tấn công với, nhưng, như chúng ta sẽ thấy ngay, không được bảo đảm để tấn công va chạm. Hoàn tác chỉnh sửa Cách tấn công Tiền ảnh 2: 6 Tiêu chuẩn của Hàm băm mật mã Tiền ảnh 1 Tiền ảnh 2 Đụng độ Giả sử cho M và H(M) , tìm M’ ≠ M sao cho h(M) = H(M’) Hình Mô hình tấn công tiền ảnh 2 Thuật toán: tiền ảnh 2 Second_Preimage_Attack(D,M) { For (i = 1 to k-1) { Create (M[i]) T ← h(M[i]) If (T = D) return M[i] } Return failure } Những khó khăn của một cuộc tấn công tiền ảnh 2 có tỉ lệ với 2 n Cách tấn công Đụng độ: Tìm M’ ≠ M sao cho h(M) = h(M’) Thuật toán: Đụng độ Collision_Attack(D,M) { For (i = 1 to k) { Create (M[i]) D[i] ← h(M[i]) for (j = 1 to i-1) { 7 if (D[i] = D[j] return M[i] and M[j]) } } Return failure } Những khó khăn của một cuộc tấn công đụng độ có tỉ lệ với 2 n/2 . Một hàm băm mật mã sử dụng một digest của 64 bit. Có bao nhiêu digest không cần phải tạo ra Eve để tìm hai thông điệp với cùng digest với xác suất hơn 0,5? Giải pháp Số lượng digest được tạo ra là k ≈ 1,18 × 2n / 2 ≈ 1,18 × 232. Nếu Eve có thể kiểm tra 220 (gần một triệu) mỗi thông điệp thứ hai, nó mất 1,18 × 212 giây hoặc ít hơn hai giờ. Điều này có nghĩa rằng một thông điệp digest kích thước 64 bit không được bảo vệ chống lại các cuộc tấn công va chạm. Xen kẽ tấn công đụng độ Thuật toán: xen kẽ đụng độ Alternate_Collision_Attack(M[k],M’[k]) { For (i = 1 to k) { D[i] ← h(M[i]) D’[i] ← h(M’[i]) if (D[i] = D’[j] return M[i], M’[j]) } Return failure } Những khó khăn của một cuộc tấn công đụng độ có tỉ lệ với 2 n/2 . Tóm tắt các cuộc tấn công Bảng sau cho thấy mức độ khó khăn đối với mỗi đòn tấn công nếu digest là n bit. Attack Giá trị của khóa k với P = 1/2 Thứ tự Preimage k ≈ 0.69 x 2 n 2 n Second Preimage k ≈ 0.69 x 2 n + 1 2 n Collision k ≈ 1.18 x 2 n/2 2 n/2 Alternate collision k ≈ 0.83 x 2 n/2 2 n/2 Các hàm băm mới, đó là khả năng để trở thành tiêu chuẩn NIST, là SHA-512, trong đó có một 512-bit digest. Chức năng này chắc chắn là khả năng chống các cuộc tấn công va chạm dựa trên Random Oracle Model. Nó cần 2 512/2 = 2 256 kiểm tra để tìm thấy một vụ đụng độ với xác suất 1/2. 5. Các cuộc tấn công vào cấu trúc 8 Tấn công hàm hash theo kiểu gặp nhau ở giữa (meet – in – the – middle attack) Phương pháp tấn công gặp nhau ở giữa áp dụng cho các hàm Hash xây dựng trên cơ sở mã khối, mà chúng ta tìm hiểu ở phần trước. Phương pháp này cho kết quả tốt hơn phương pháp tấn công theo ngày sinh nhật. Trong tấn công theo kiểu ngày sinh nhật tìm được va chạm nhưng giá trị nhận được của hàm Hash đối với tìm kiếm va chạm là ngẫu nhiên. Tấn công đầu tiên được đề xuất là tấn công trên hàm Hash xây dựng trên cơ sở sơ đồ Rabin xem hình 11.1. Sơ đồ này dựa trên thuật toán mã khối an toàn. Sơ đồ dựa trên ý tưởng về tính toán phức tạp xác định khóa khi biết đầu vào và đẩu ra của khối dữ liệu. Khối dữ liệu Mi được sử dụng như khóa tương ứng với một vòng tính toán của hàm Hash. Tìm kiếm va chạm liên quan đến bài toán tính toán khóa. Ví dụ, tấn công có thể thay thế một số khối M k thành M’ k . Điều này dẫn đến nhận được giá trị mới của vòng hàm hash H’ k . Có thể tồn tại một số khóa mã M’ k+1 , mà chúng ta nhận được đẳng thức sau: 1 ' ' ' 1 )( 1 ++ == + kkMk HHEH k . Nếu như cách thám mã tìm được 1 ' +k M đã cho thì thay thế khối dữ liệu k M và 1+k M thành k M ' và 1 ' +k M , tức là ta đã tìm được bản tin mới, mà có giá trị hàm Hash bằng với giá trị hàm Hash của bản tin ban đầu. Nếu như thuật toán mã khối là vững chắc đối với phép tấn công trên cơ sở biết bản tin, thì phép tấn công đã cho trên hàm Hash có độ tính phức tạp cao. Chúng ta xem cụ thể phép tấn công này. Giả sử cho bản tin M, giá trị hàm Hash của M là H. Mục đích của phép tấn công là tìm ra bản tin khác M’ mà gía trị hàm Hash của M’ cũng bằng H. Chúng ta chia bản tin ), ,,, ,,( 121 nkk MMMMMM + = thành hai phần ), ,,( 21 )1( k MMMM = và ), ,( 1 )2( nk MMM + = . Phần đẩu tiên của bản tin được biến dạng nhiều lần và mỗi sự biến dạng đó giá trị hàm Hash được tính bằng )1( H . Giả sử nhận được N 1 gía trị )1( H từ N 1 phương án của phần thứ nhất (xem hình …). Phần thứ hai của bản tin )2( M cũng biến dạng nhiều lần, từ mỗi biến dạng đó hàm Hash được tính theo thuật toán khác, ở đây chúng ta tính theo thứ tự ngược và sử dụng hàm giải mã D, tương ứng vơi hàm mã hóa E (xem hình…). Giả sử thu được N 2 giá trị )2( H từ N 2 phương án của phần hai. Khi số lượng N 1 và N 2 đủ lớn thì có thể tìm được cặp giá trị bằng nhau trong số )1( H và )2( H vớ xác suất lớn. Giả sử rằng nó tương ứng với hai bản tin là )1( 'M và )2( 'M . Rõ 9 ràng rằng bản tin MMMM ≠= )','(' )2()1( mà H(M)=H(M’). Vậy đã tìm ra được sự va chạm. Giờ chúng ta xác định xem cần bộ nhớ và độ khó của phương pháp tấn công này. Chúng ta giả sử rằng N 1 và N 2 tồn tại giá trị nhỏ hơn m 2 , m là kích thước của giá trị băm. Như thế, với giá trị xác suất gần đúng đủ chính xác có thể tiếp nhận, sao cho giá trị đầu tiên )1( H từ tập { } )1( H không trùng với một giá trị nào của tập { } )2( H bằng 2 )21( 1 N m p − −≈ . Xác suất để không một giá trị nào của tập { } )1( H trùng với một giá trị của tập { } )2( H bằng 12 )21(' NN m p − −≈ Như vậy xác suất để tìm ra ít nhất một cặp trùng nhau giữa tập { } )1( H và tập { } )2( H là mm NN m NNNNpp −−− ⋅≈⋅−−≈−−=−≈ 2)21(1)21(1'1 2121 21 . Bây giờ với điều kiện 2/12 21 =⋅ −m NN đốiv với trường hợp NNN == 21 dễ dàng xác định giá trị N 1/2 , với xác suất va chạm là ½: 1 2/1 2 − ≈ m N . Để nhận được đánh giá chính xác hơn khi 2/ 21 2 m NN − == có thể nhận gía trị p=0.63. Như vậy cần bộ nhớ cần thiết cho phép tấn công là 1 22 −m m bít, độ khó tấn công là 1 21 2 + ≈+ m NN . III. Tổng quan về lý thuyết mật mã và bảo mật thông tin Mật mã học là ngành khoa học ứng dụng toán học vào việc biến đổi thông tin thành một dạng khác với một mục đích là che dấu nội dung, ý nghĩa thông tin cần mã hóa. Các ứng dụng của mật mã học và bảo mật thông tin rất đa dạng và phong phú tùy vào đặc trưng mỗi hệ thống sẽ có những đặc trưng riêng như: Tính bảo mật thông tin, tính toàn vẹn thông tin, Xác thực trong liên lạc và nội dung trong liên lạc, chống lại sự thoái thác trách nhiệm. Các phương pháp mã hóa - Mã hóa đối xứng: Là quá trình mã hóa và giải mã một thông điệp sử dụng cùng một mã khóa gọi là khóa bí mật hay còn gọi là khóa đối xứng. Một số phương pháp mã hóa đối xứng như là mã hóa cổ điển, mã hóa khối 10 [...]... II Hàm băm mật mã học 1 Hàm băm Hàm băm (tiếng Anh: hash function) là hàm sinh ra các giá trị băm tương ứng với độ dài cố định với một khối dữ liệu đầu vào không giới hạn kích thước Hàm băm thường được dùng trong bảng băm nhằm giảm chi phí tính toán khi tìm một khối dữ liệu trong một tập hợp (nhờ việc so sánh các giá trị băm nhanh hơn việc so sánh những khối dữ liệu có kích thước lớn) 2 Hàm băm mật mã. .. Wt-14 xor Wt-8 xor Wt-3) Xây dựng hàm băm trên cơ sỡ mật mã đối xứng Một trong các phương pháp hiệu quả để xây dựng hàm hash là xây dựng trên cơ sở hàm mật mã khối Giả sử E là hàm mã khối an toàn (có thể sử dụng hàm mật mã là hàm biến đổi một chiều) với kích thước khối là m bít, cho bản tin đầu vào được chia ra n khối m bít: M = ( M 1 , M 2 , , M n ) Hàm tính giá trị băm có thể viết dưới dạng sau: H...- Mã hóa bất đối xứng: còn được gọi là phương pháp mã hóa khóa công cộng giúp cho việc trao đổi mã khóa trở nên dễ dàng hơn Nội dung của khóa công cộng (public key) không cần phải giữ bí mật như đối với khóa bí mật trong các phương pháp mã hóa quy ước 1 Đảm bảo tính toàn vẹn dữ liệu Hàm băm mật mã học là hàm băm và có tính chất là hàm 1 chiều Từ khối dữ liệu hay giá trị băm đầu vào chỉ có... lớn) 2 Hàm băm mật mã học Trong ngành mật mã học, một hàm băm mật mã học (tiếng Anh: Cryptographic hash function) là một hàm băm với một số tính chất bảo mật nhất định để phù hợp việc sử dụng trong nhiều ứng dụng bảo mật thông tin đa dạng, chẳng hạn như chứng thực (authentication) và kiểm tra tính nguyên vẹn của thông điệp (message integrity) Hàm băm mật mã là hàm toán học chuyển đổi một thông điệp... tác giả thiết kế hàm băm chống xung đột dựa trên một khối mã hóa thô sơ-một khối mật mã Một khối mật mã là một hoán vị khóa E: {0, 1}n x {0, 1}k → {0, 1}n Về mặt kỹ thuật, Một khối mật mã dùng để nén đầu vào của nó - nó ánh xạ k + n bit tới n bit Tuy nhiên, Một khối mật mã thậm chí không phải là oneway: để đảo ngược E trên w, cố định bất kỳ khoá k 0 và giải mã w dưới khoá này Nếu w giải mã cho ra x, sau... thuật toán băm sẽ không còn an toàn nữa Cách tấn công nhằm tạo ra một thông điệp khác với thông điệp ban đầu nhưng có cùng giá trị băm gọi là tấn công “tiền ảnh thứ hai” (second pre-image attack) 4 Cấu trúc của Hàm băm mật mã 11 Có thể chứng minh cấu trúc bảo mật của hàm băm mật mã bao gồm hai thành phần có thể được nghiên cứu độc lập với nhau Thành phần đầu tiên là hàm nén mà ánh xạ một đầu vào với chiều... tạo ra hàm Hash thì hàm hash phải thỏa mãn các yêu cầu sau: 1 Đối số của hàm hash là bản tin có chiều dài bất kỳ; 2 Giá trị của hàm hash có chiều dài không đổi; 3 Hàm H(x) cần phải có tính toán hiệu quả, tức là thuật toán Hash khi thực hiện trên phần cứng và phần mềm cần phải có công suất lớn Phải đảm bảo được rằng quá trình ký và kiểm tra lên giá trị của hàm hash nhanh hơn so với quá trình ký và kiểm... khối mã hoá trong một hàm nén chống xung đột Hai đề án thường được sử dụng nhất trong các hàm băm như sau: Davies-Meyer: H(x, y) = Ey(x) ⊕ y Miyaguchi-Preneel: H(x, y) = Ex(y) ⊕ x ⊕ y Bằng chứng của bảo mật của những đề án này và khối mã hóa - dựa trên giả định rằng các thuật toán mã hoá cơ bản là không thể phân biệt từ một khái niệm trừu tượng cụ thể, gọi là mã hóa ý tưởng, vượt xa các yêu cầu bảo mật. .. Hn c) Hình 11.2.Sơ đồ biểu diễn hàm Hash tương ứng với phương án 1 (a), 5(b) và 10 (c) ở bảng… Trên cơ sở ba tham số Hi-1, Mi-1 và Mi có thể xây dựng rất nhiều phương án xây dựng hàm Hash khác với việc sử dụng một thanh ghi có kích thước lớn Thế nhưng chúng ta quan tâm nhất là xây dựng trên cơ sở hàm một chiều F không có đầu vào phụ Các phương án được nêu ra trên hình 11.3, các hàm F phải có đầu vào... là mã hóa ý tưởng, vượt xa các yêu cầu bảo mật tiêu chuẩn cho khối mã hóa Domain extender Tên miền mở rộng là một cấu trúc chung mà biến đổi một hàm nén với đầu vào có độ dài cố định vào một hàm băm với đầu vào tùy ý Tên miền mở rộng đơn giản và được sử dụng phổ biến nhất là cấu trúc Merkle -Damgard và nó hoạt động như sau: 12 Cho một hàm nén C: {0, 1}n x {0, 1}m → {0, 1}n n-bit liên tục IV Input: Thông . TẬP MÔN LÝ THUYẾT MẬT MÃ VÀ BẢO MẬT THÔNG TIN Tên đề tài: Hàm băm mật mã và mô hình random oracle Giáo viên hướng dẫn: PGS. TS Nguyễn Hiếu Minh 1 MỤC LỤC Lời giới thiệu I. Mô hình random oracle ượớệở. liệu Hàm băm mật mã học là hàm băm và có tính chất là hàm 1 chiều. Từ khối dữ liệu hay giá trị băm đầu vào chỉ có thể đưa ra 1 giá trị băm duy nhất. Như chúng ta đã biết đối với tính chất của hàm. của Hàm băm mật mã 11 Có thể chứng minh cấu trúc bảo mật của hàm băm mật mã bao gồm hai thành phần có thể được nghiên cứu độc lập với nhau. Thành phần đầu tiên là hàm nén mà ánh xạ một đầu vào

Ngày đăng: 21/08/2015, 16:37

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w