Khóa luận Xử lý song song quá trình sinh khóa của hệ thống cấp phát chứng thực số

TÓM TẮT NỘI DUNG Khóa luận có trình bày về một số vấn đề của an toàn thông tin hiện đại. Các vấn đề đó đều dẫn đến một nhu cầu bức thiết là phải xây dựng một hệ thống chứng thực số, tạo điều kiện cho các ứng dụng chữ ký số phát triển. Phần tiếp theo là các lý thuyết về chứng thực và chữ ký số, hệ thống chứng thực số CA ứng dụng hệ mã RSA mà cốt lõi là quá trình sinh khóa. Thực chất của quá trình sinh khóa là sinh ra một cặp số nguyên tố thỏa mãn được các tính chất là số nguyên tố xác suất mạnh. Với yêu cầu về số nguyên tố như thế, phần tiếp theo khóa luận có đề cập đến các lý thuyết về số nguyên tố, việc kiểm tra số nguyên tố, và các tính chất để một số nguyên tố được gọi là mạnh. Với một khối lượng tính toán trên số nguyên lớn như vậy, xử lý tuần tự là không đáp ứng được nhu cầu về thời gian, cho nên một phương pháp xử lý song song trên CPU (central processing unit) đã được nhắc đến. Đó chính là bộ công cụ Visual Studio 2010 của Microsoft. Phần cuối của khóa luận là các kết quả đạt được và định hướng cho tương lai. MỤC LỤC LỜI MỞ ĐẦU 5 NỘI DUNG 3 Chương 1. Những vấn đề của an toàn thông tin hiện đại 3 1.1. An toàn thông tin hiện đại 3 1.2. Chứng thực và chữ ký số 3 1.2.1. Hệ mã khóa công khai và việc tạo chữ ký số 3 1.2.2. Chứng thực số 8 1.3. Vai trò của CA và vấn đề then chốt trong thiết lập CA 10 1.3.1. Vai trò của CA 10 1.3.2. Sử dụng chứng thực số 10 1.3.3. Các chức năng cơ bản của CA 11 1.3.4. Vấn đề then chốt trong thiết lập CA 13 Chương 2. Một số công cụ toán học liên quan 15 2.1. Số nguyên tố và hệ mã khóa công khai RSA 15 2.1.1. Hệ mã khóa công khai RSA 15 2.1.2. Lý thuyết toán học về số nguyên tố và các vấn đề liên quan 17 2.2. Việc tính toán số nguyên tố và khái niệm số giả nguyên tố. Kiểm tra số giả nguyên tố mạnh. 20 2.2.1. Thuật toán kiểm tra số nguyên tố thông thường và khái niệm số giả nguyên tố 20 2.2.2. Kiểm tra số giả nguyên tố mạnh 20 2.2.3. Tính nguyên tố mạnh của một số 25 2.3. Chìa khóa an toàn 26 Chương 3. Tính toán song song 28 3.1. Xử lý song song, cơ hội và thách thức [8] 28 3.1.1. Cơ hội 29 3.1.2. Những thách thức: Các vấn đề khó khăn gặp phải khi xử lý song song 30 3.1.3. Giải pháp: Các công nghệ song song trong Visual Studio 2010 Microsoft 32 3.2. Lập trình song song với Visual Studio 2010 [8] 33 3.2.1. Thư viện 33 3.2.2. Các mô hình lập trình song song và ví dụ 34 3.2.3. Kết luận 38 Chương 4. Kết quả triển khai và tính thử nghiệm 39 4.1. Giới thiệu về chương trình ứng dụng 39 4.1.1. Mục đích và hoạt động của chương trình 39 4.1.2. Một số hình ảnh về chương trình 40 4.2. Một số thống kê khi chạy chương trình trên chip intel core2duo 2.2 GHZ 43 PHỤ LỤC 44 A. Thuật toán Miller-Rabin 44 B. Thuật toán Lucas 44 C. Thuật toán kiểm tra nguyên tố mạnh 45 KẾT LUẬN 47 TÀI LIỆU THAM KHẢO 48 LỜI MỞ ĐẦU Hiện nay, ở các nước phát triển cũng như đang phát triển, mạng máy tính đóng vài trò quan trọng trong mọi lĩnh vực hoạt động của xã hội, và một khi nó trở thành phương tiện điều hành các hệ thống thì nhu cầu bảo mật thông tin được đặt lên hàng đầu. Nhu cầu này không chỉ có ở các bộ máy của nhà nước, mà đã trở thành bức thiết trong nhiều hoạt động kinh tế xã hội: tài chính, ngân hàng, thương mại Những ứng dụng trong dân sự của an toàn thông tin ngày càng được phát triển, mở rộng đặc biệt là chữ ký số. Khi các văn bản tài liệu đã được số hóa, được chuyển đi rất nhanh trong hệ thống mạng thì ký tay thông thường là một trở ngại cho các hoạt động trao đổi thông tin. Bên cạnh đó, một hệ thống chứng thực thông tin, chứng thực số là cần thiết được phát triển khi mà nhu cầu trao đổi thông tin, xác thực thông tin của các cơ quan, xí nghiệp, ngân hàng, ngày càng tăng đi kèm với sự phát triển mạnh của cơ sở hạ tầng mạng. Hệ thống chứng thực số CA (certificate authority) là một giải pháp cho vấn đề này. Với CA, mỗi người tham gia vào hệ thống được cấp phát một cặp chìa khóa bí mật, công khai. Khi muốn gửi thông tin người sử dụng lấy chìa khóa bí mật mã hóa văn bản và gửi đi, người nhận sẽ lấy chìa khóa công khai của người gửi để giải mã. Đồng thời với sự chứng thực của hệ thống CA, đoạn thông tin đó sẽ được đảm bảo là thuộc về người gửi. Ngoài ra, với những giấy tờ, hợp đồng kinh tế, cần có chữ ký của các bên liên quan, người ký có thể sử dụng chìa khóa bí mật để mã hóa văn bản. (Hành động này giống như ký tay trên giấy tờ hành chính thông thường). Như vậy, việc xây dựng hệ thống CA là quan trọng, cần thiết trong đời sống xã hội mà công nghệ thông tin đóng vài trò chủ chốt trong giao dịch, buôn bán. Một ví dụ cụ thể, trung tâm tin học thuộc viện nghiên cứu khoa học và công nghệ Việt nam đang có dự án xây dựng hệ thống CA để phát triển các ứng dụng của chữ ký số và chứng thực điện tử. Kết quả của khóa luận này sẽ được dùng trong quá trình rất quan trọng của hệ thống CA sắp tới được phát triển – cấp phát khóa. Vấn đề then chốt của hệ thống CA là quá trình cấp phát và chứng thực một khóa có thuộc về một cá thể nào đó hay không. Quá trình cấp phát khóa về thực chất là sinh ra một cặp số nguyên tố thỏa mãn các yếu cầu để được là nguyên tố mạnh. Những tính toán trên số nguyên lớn đòi hỏi thời gian rất lâu để sinh ra một cặp số như vậy, chưa kể đến thời gian kiểm tra thỏa mãn tính nguyên tố mạnh. Hơn thế nữa, một hệ thống CA khi được triển khai nếu gặp tình trạng có nhiều người sử dụng truy cập tại một thời điểm và yêu cầu cấp phát khóa, sẽ xảy ra hiện tượng nghẽn mạng, tắc cổ chai nếu phần sinh khóa không đáng ứng được về thời gian. Hệ thống như thế được xem là không đạt yêu cầu. Một giải pháp được đưa ra là xử lý song song trong quá trình sinh khóa của hệ thống CA. Thời gian trước, công nghệ xử lý song song được thực hiện trên các cụm nhiều máy chủ do thời ấy một CPU (central processing unit) không có nhiều nhân. Ngày nay, với sự phát triển vượt bậc của công nghệ phần cứng, các hãng phần cứng nổi tiếng thế giới đã nghiên cứu và liên tục cho ra đời nhiều bộ xử lý tích hợp nhiều lõi bên trong (2, 4, 8 thậm chí 16 lõi). Đây là một thời điểm thuận lợi để ứng dụng công nghệ xử lý song song trên một CPU có nhiều nhân. Một phương án khác có lợi hơn về mặt kinh tế là tính toán trên card đồ họa (graphic card). Card đồ họa tuy có thế mạnh về xử lý vector (xử lý nhiều bộ số một lúc) nhưng công nghệ song song còn chưa phát triển (chưa có thư viện cần thiết để sinh được một cặp số nguyên tố lớn và kiểm tra tính nguyên tố mạnh của chúng). Vì vậy, xử lý song song trên CPU nhiều nhân là một phương án hợp lý, cân đối về mặt kinh tế và công nghệ hỗ trợ cũng như là tốc độ. Tập đoàn Microsoft mới cho ra đời bộ công cụ Visual Studio 2010 hỗ trợ xử lý song song trên CPU nhiều nhân, đồng thời có thư viện xử lý số nguyên lớn. C Sharp (C#) – một ngôn ngữ lập trình trong bộ công cụ này sẽ được sử dụng để phát triển giai đoạn quan trọng ban đầu của một hệ thống CA – sinh khóa.

doc52 trang | Chia sẻ: lvcdongnoi | Lượt xem: 2333 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Khóa luận Xử lý song song quá trình sinh khóa của hệ thống cấp phát chứng thực số, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
chứng nhận có hiệu lực: not-before và not-after. Not-before: thời gian chứng nhận bắt đầu có hiệu lực; Not-after: thời gian chứng nhận hết hiệu lực. Các giá trị thời gian này được đo theo chuẩn thời gian Quốc tế, chính xác đến từng giây. Subject Name: Tên chủ thể được cấp chứng thực. Public Key: Chìa khóa công khai của chủ thể được cấp chứng thực. Issuer Unique ID & Subject Unique ID: Được đưa vào sử dụng từ X.509 phiên bản 2, dùng để xác định hai tổ chức CA hoặc hai chủ thể khi chúng có cùng DN. RFC 2459 đề nghị không nên sử dụng hai trường này. Extensions: Chứa các thông tin bổ sung cần thiết mà người thao tác CA muốn đặt vào chứng nhận. (Mới được đưa ra trong X.509 phiên bản 3). Signature: chữ ký số được tổ chức CA áp dụng. Tổ chức CA tạo chữ ký bằng khóa bí mật với kiểu thuật toán mã được quy định trong trường thuật toán chữ ký. Chữ ký bao gồm tất cả các phần khác trong giấy chứng nhận. (Qua đó thể hiện CA chứng nhận cho tất cả các thông tin khác trong giấy chứng thực, chứ không chỉ cho tên chủ thể và khóa công khai). Hình 1.3: Những nội dung thông tin cơ bản theo chuẩn X.509 [13] 1.3. Vai trò của CA và vấn đề then chốt trong thiết lập CA 1.3.1. Vai trò của CA Chứng thực số là tiền đề cho nhiều ứng dụng của mật mã khóa công khai. Đối với các hệ mã đối xứng (bí mật), việc trao đổi chìa khóa (bí mật) giữa những người sử dụng trên quy mô rộng là vô cùng khó khăn, hầu như không thể thực hiện được. Với các hệ mã hóa khóa công khai, người ta có thể thoát ra khỏi khó khăn này. Trên nguyên tắc, nếu cá nhân A muốn người khác giử thông tin mật cho mình thì chỉ cần công bố chìa khóa công khai của chính mình. Bất kỳ ai có được chìa khóa này đều có thể gửi thông tin mật cho A. Tuy nhiên, khi ấy lại nảy sinh một vấn đề khác. Thật vậy, nếu chìa khóa công khai của A không được chứng thực, một người nào đó (D) cũng có khả năng đưa ra một chìa khóa công khai khác và giả mạo rằng đó là chìa khóa của A. Bằng cách làm như vậy kẻ “mạo danh” này có thể đọc được một số thông tin mà người khác gửi cho A. Nếu như chìa khóa công khai của A có trong một chứng thực số (được chứng thực bởi một bên thứ 3, chẳng hạn như là T, với công nghệ chữ số) thì bất kỳ ai tin tưởng vào T cũng có thể kiểm tra chìa khóa công khai của A. Nói cách khác, kẻ mạo danh D ắt sẽ bị lật tẩy. Trong mô hình hạ tầng khóa công khai thì T chính là nhà cung cấp chứng số (CA – Certificate Authority). 1.3.2. Sử dụng chứng thực số Khi áp dụng chứng thực số ở quy mô lớn, có rất nhiều CA cùng hoạt động. Vì vậy một cá thể A có thể không quen thuộc (không đủ tin tưởng) với CA của một cá thể B khác. Do đó chứng thực của B có thể phải bao gồm chữ ký của CA ở mức cao hơn. Quá trình này dẫn đén việc hình thành một mạng lưới quan hệ phức tạp và phân tầng giữa các CA. Trong tiêu chuẩn X.509 về hệ thống hạ tầng khóa công khai, mạng lưới CA tạo thành cây từ trên xuống với gốc là một CA trung tâm mà không cần được chứng thực bởi một bên thứ 3 nào khác. Cũng giống như giấy CMND, một chứng thực điện tử cũng có thời hạn lưu hành nhất định, và có thể bị thu hồi trước thời han. Một chứng thực số có thể bị thu hồi nếu như chìa khóa bí mật (cùng cặp với chìa khóa công khai của nó) đã bị lộ, hoặc mối liên hệ giữa khóa công khai và chủ thể sở hữu đã thay đổi. Điều này có thể xảy ra ở mức độ không thường xuyên, nhưng người sử dụng phải luôn kiểm tra tính pháp lý của chứng thực số mỗi khi sử dụng. Việc kiểm tra có thể thực hiện bằng cách so sánh chứng thực với danh sách các chứng thực bị thu hồi (Certificate Revocation List – CRL). Việc đảm bảo danh sách này luôn chính xác và được cập nhật kịp thời là chức năng cơ bản của hạ tầng khóa công khai tập trung [13]. 1.3.3. Các chức năng cơ bản của CA Hình 1.4: Các chức năng của hệ thống CA [13] Cấp phát chứng thực [13] Cấp phát chứng thực là nhiệm vụ đầu tiên của một CA. Công việc này được thực hiện trên cơ sở một yêu cầu được đưa ra từ phía người dùng. Trong các hệ thống không lớn lắm, các yêu cầu này được trực tiếp gửi cho CA để trực tiếp xử lý, còn với các hệ thống lớn thường có thêm một khâu trung gian (đăng ký – registration) nhận yêu cầu từ phía người dùng chuyển cho CA và nhận chứng thực từ CA trả về cho người dùng. Để tạo ra một chứng thực số, CA phải sinh được một cặp chìa khóa phi đối xứng có độ an toàn cao để gán cho chủ thể (người yêu cầu) và tuân thủ một số quy định nghiêm ngặt trong việc cấp phát (ví dụ tránh để xảy ra nhầm lẫn cấp một chứng thực cho hai chủ thể khác nhau, hoặc tránh dùng hai định danh quá giống nhau có thể dẫn đến khả năng mạo danh). Thông tin ghi trong chứng thực là những thông tin cơ bản nhất về chủ thể và cơ quan cấp chứng thực (như trong giấy CMND), ngoài ra có một thông tin mang tính đặc thù cho chứng thực số (vốn không có trong CMND thông thường) đó là chìa khóa công khai. Đây chính là chìa khóa mà người khác dùng để kiểm tra chữ ký số của chủ nhân mang chứng thực. Để không thể xảy ra khả năng mạo nhận chìa khóa (như đã thấy với hiện tượng mạo danh), người phát hành chứng thực (tức là CA) sẽ dùng chìa khóa bí mật của mình ký lên cụm thông tin có trong chứng thực (trong đó có tên chủ thể cùng chìa khóa công khai). Chữ ký được đặt ngay dưới cụm thông tin đã được ký để người khác dể dàng kiểm tra (xem sơ đồ kèm theo). Hình 1.5: Sơ đồ minh họa chức năng cấp phát chứng thực của CA [13] Kiểm tra chứng thực [13] Để kiểm tra một chứng thực của người dùng, người ta cần phải có được thông tin chính xác về chìa khoá công khai của CA. Tốt nhất là lấy từ trong Chứng thực số của chính CA. Người ta dùng chìa khoá này để giải mã phần chữ ký số có trong chứng thực của người dùng rồi lấy kết quả tìm được đem so với mã băm của phần thông tin công khai trong chứng thực số (tức là phần còn lại từ chứng thực số sau khi đã bỏ đi phần chữ ký số). Sơ đồ minh họa: Hình 1.6: Sơ đồ minh họa chức năng kiểm tra chứng thực của CA [13] Các chứng năng còn lại của CA mang tính kỹ thuật thuần túy, ta không đề cập đến ở đây. 1.3.4. Vấn đề then chốt trong thiết lập CA Bước đầu tiên và cũng là quan trọng nhất của một hệ thống chứng thực số CA là cấp phát khóa. Các hệ thống CA có thể sử dụng nhiều thuật toán tạo chữ ký số khác nhau của hệ mã phi đối xứng. Trong các hệ mã phi đối xứng thì hệ mã RSA được sử dụng rộng rãi và phổ biến nhất. Hệ mã RSA có độ bảo mật cao, luôn là thách thức cho giới thám mã. Nước ta đã đưa ra chuẩn chữ ký số, trong đó RSA được sử dụng như một hệ mã chuẩn trong một thời gian dài sắp tới. Việc sinh khóa trong hệ mã RSA về thực chất là tạo ra một cặp số lớn là các số nguyên tố mạnh. Để sinh được một cặp số nguyên tố như vậy, chúng ta phải tìm hiểu các lý thuyết toán học có liên quan đến số nguyên tố, số giả nguyên tố như: các định lý của số nguyên tố, kiểm tra số nguyên tố và số giả nguyên tố, và cách kiểm tra số giả nguyên tố mạnh sẽ được đề cập ở chương tiếp theo. Chương 2. Một số công cụ toán học liên quan 2.1. Số nguyên tố và hệ mã khóa công khai RSA 2.1.1. Hệ mã khóa công khai RSA Trước khi đi vào các lý thuyết toán học có liên quan đến việc sinh, kiểm tra số nguyên tố để làm khóa cho CA, ta tìm hiểu kỹ hơn về hệ mã RSA được ứng dụng trong hệ thống chứng thực số. Hệ mã đối xứng và hệ mã phi đối xứng [1] Khái niệm mã đối xứng được dùng để chỉ các hệ mã mà trong đó, khi biết khóa lập mã, ta có thể tìm ra khóa giải mã, đồng thời, việc giải mã cùng đòi hỏi thời gian như việc lập mã. Cho đến những năm cuối của thập niêm 70 của thế kỉ 20, người ta mới chỉ biết đến một loại mã như vậy. Đối với các hệ mã này, cần phải giữ bí mật khóa lập mã, vì để lộ nó cũng tức là để lộ cách giải mã. Do đó, chỉ những người hoàn toàn chia sẻ mọi thông tin mật với nhau mới có thể trao đổi với nhau bằng mật mã. Điều này giải thích nguyên nhân của việc cho đến rất gần đây mật mã thường chỉ được dùng trong quân sự, ngoại giao, tức là khi những đối tượng cần trao đổi thông tin mật với nhau là khá it, hơn nữa, lại cùng chung quyền lợi nên sẵn sàng bảo vệ bí mật cho nhau trong quá trình trao đổi thông tin. Sự phát triển của xã hội dẫn đến việc ngày nay mật mã không những chỉ được dùng trong bí mật quân sự và ngoại giao, mà còn dùng, và có thể chủ yếu là dùng trong bí mật kinh tế, tài chính, thương mại. Vì thế xuất hiện những đòi hỏi mới đối với các hệ mật mã hiện đại, khác về nguyên tắc so với mật mã thường dùng trước đây. Không giống như các hoạt động quân sự hoặc ngoại giao, trong hoạt động kinh doanh, số lượng đơn vị phải cùng trao đổi thông tin thường là rất lớn. Thậm chí, những người có quyền lợi cạnh tranh nhau cũng có nhu cầu trao đổi những thông tin mặt với nhau. Bởi thế, những mật mã đối xứng khó có thể thích hợp. Hiển nhiên, muốn gửi một thông báo mật cho một đối tượng nào đó, ta cần phải biết khóa lập mã của họ, vì thế, những người cùng dùng một chìa trong hệ mã đối xứng đều biết hết bí mật của nhau. Các hệ thống mật mã hiện đại, mật mã khóa công khai, hay còn gọi là mã phi đối xứng, khắc phục được những nhược điểm đó: mỗi người tham gia trong hệ thống chỉ cần giữ bí mật chìa khóa giải mã của mình (còn gọi là chìa khóa bí mật), trong khi khóa lập mã được thông báo công khai (và thường được gọi là chìa khóa công khai). Việc biết khóa lập mã không cho phép tìm ra khóa giải mã trong một thời gian chấp nhận được, ngay cả khi sử dụng những máy tính hiện đại nhất. Những hệ mã phi đối xứng tìm thấy đầu tiên là những mật mã dùng các hàm số học. Hệ mã RSA [1] Trong các hệ mã phi đối xứng thì hệ mã RSA (phát minh năm 1978 bởi Rivest, Shamir và Adleman) được sử dụng rộng rãi và phổ biến nhất. Hệ mã RSA có độ bảo mật cao, luôn là thách thức cho giới thám mã. Nước ta đã đưa ra chuẩn chữ ký số, trong đó RSA được sử dụng như một hệ mã chuẩn trong một thời gian dài sắp tới. Hệ RSA được xây dựng trên cơ sở mã mũ, trong đó khóa lập mã (công khai) là cặp , gồm số mũ và modulo . Khóa giải mã (bí mật) là cặp . Với là số nghịch đảo của modulo . Số là tích của hai số nguyên tố rất lớn nào đó, , còn được chọn là số nguyên tố cùng nhau với , trong đó là giá trị hàm Euler của . Để mã hóa một thông báo, trước tiên ta chuyển nó sang dạng số và nhóm thành các khối với độ dài lớn nhất có thể (tùy thuộc khả năng tính toán và tốc độ yêu cầu) với một số chẵn chữ số. Để mã hóa một khối trong văn bản, ta tính . Khi ấy, do một hệ quả của Định lý Euler (sẽ được trình bày ở phần sau), quá trình giải mã không đòi hỏi phải “khai căn bậc modulo ” của khối văn bản mã, nếu như biết được số nghịch đảo của modulo , tức là thỏa mãn . Nghịch đảo này tồn tại theo điều kiện và, do hệ quả đã nêu, ta có , khi . Chú ý rằng, xác suất để và không nguyên tố cùng nhau là hết sức nhỏ, vì điều này chỉ có thể xảy ra khi là bội của hoặc . Thông thường chỉ là những “khối văn bản” có độ dài không lớn, nói chung là nhỏ hơn hẳn và , cho nên điều kiện là luôn xảy ra, và công thức trên cho thấy việc giải mã một khối trong văn bản mật cũng chính là việc nâng lên lũy thừa bậc rồi rút gọn theo modulo . Cặp được gọi là khóa giải mã. Việc biết chìa khóa lập mã không dẫn đến việc tìm được chìa khóa giải mã . Để có thể tìm được thì ta phải tìm được . Việc tìm không dễ hơn với việc phân tích ra tích của hai số nguyên tố rất lớn là và . Thật vậy, ta có: ; . Từ các công thức đó để tìm được và thì với khả năng của con người, thậm chí là máy tính có tốc độ xử lý cao là không thể. Độ an toàn của RSA [1] Nếu ta chọn các số và khoảng 100 chữ số thập phân, thì sẽ có khoảng 200 chữ số thập phân. Để phân tích một số nguyên cỡ lớn như thế, với các thuật toán nhanh nhất hiện này và với những máy tính hiện đại nhất, ta mất hàng tỷ năm! Sau khi tìm ra hệ mã, Rivesst, Shamir và Adleman có viết một bài báo công bố phát minh dưới dạng một thông báo khoa học của MIT và, trên cột Martin Gardner’s của tờ báo Scienfitic American, họ có đưa ra lời thách thức bạn đọc bẻ khóa một mẩu tin nhỏ đã được mã hóa với: n=114381625757888867669235779976146612010218296721242362562561842935706935245733897830597123563958705058989075147599290026879543541 e = 9007. Mẩu tin “first solver wins one hundred dollars” xuất hiện trong dạng mã hóa (với A = 01, B=02, C=03 …) chỉ được giải mã vào ngày 26/4/1994, bằng một cố gắng tổng lực mang tính quốc tế (qua Internet) với việc sử dụng 1600 workstations, mainframes, và supercomputers tấn công trong 8 tháng liên tục để phân tích số nêu trên ra thừa số nguyên tố. Thực tế này cho thấy rằng thuật toán RSA là rất an toàn, vì không mấy khi có điều kiện để huy động một lực lượng tính toán hùng hậu như thế vào một công việc giải mã một mẩu tin. Có một vài điều cần chú ý khi chọn các số và để tránh rơi vào trường hợp tích bị phân tích nhanh nhờ những thuật toán đặc biệt: và cần chọn sao cho và không chỉ có toàn các ước nguyên tố nhỏ (có phân tích “vụn”). Ngoài ra, ước chung lớn nhất phải là số nhỏ, và phải có số chữ số trong khai triển thập phân khác nhau không nhiều. 2.1.2. Lý thuyết toán học về số nguyên tố và các vấn đề liên quan Số nguyên tố [2] Số nguyên tố là số nguyên lớn hơn 1, không chia hết cho số nguyên dương nào ngoài 1 và chính nó. Số nguyên lớn hơn 1 không phải là số nguyên tố được gọi là hợp số. Các Định lý về số nguyên tố [2] Mọi hợp số đều có ước nguyên tố nhỏ hơn . Mọi số nguyên tố lớn hơn 1 đều phân tích được một cách duy nhất thành tích các số nguyên tố, trong đó các thừa số được viết với thứ tự không giảm. Định lý số nguyên tố được Gauss phát biểu năm 1773: Với mỗi số thực dương cho trước, ta ký hiệu là số các số nguyên tố không vượt quá x. Khi đó, ta có: . Ước chung lớn nhất [2] Ước chung lớn nhất của 2 số tự nhiên là số lớn nhất trong tập các ước chung của 2 số đó, được ký hiệu là hay đơn giản là . Khi 2 số tự nhiên có ước chung lớn nhất là 1 thì chúng được gọi là nguyên tố cùng nhau. Phi hàm Euler [1] Với , số lượng các số tự nhiên bé hơn và nguyên tố cùng nhau với được ký hiệu là . Ví dụ: , , . Rõ ràng, khi là số nguyên tố thì mọi số tự nhiên bé hơn nó đều là nguyên tố cùng nhau với nó và do đó ta có . Tổng quát hơn, khi là số nguyên tố và là một số tự nhiên bất kỳ thì . Có thể chứng minh được rằng khi là các số nguyên tố cùng nhau thì ta có và do đó để tính của một số tự nhiên nào đó người ta phân tích nó ra các thừa số nguyên tố rồi áp dụng các công thức trên. Ví dụ: . Phép tính đồng dư [1] Giả sử m là một số nguyên dương. Ta nói hai số nguyên và là đồng dư với nhau theo modulo nếu hiệu chia hết cho . Ký hiệu . Phép tính đồng dư theo modulo dẫn đến việc tách tập số nguyên ra thành lớp, mỗi lớp chứa các số nguyên đồng dư với nhau theo . Tập các lớp này được ký hiệu là ( là tập các số nguyên) và chứa đúng phần tử. Mỗi lớp trong tập có đúng 1 số nằm trong đoạn , cho nên mỗi số nguyên trong đoạn này được xem “đại diện” của một lớp. Một số tính chất của phép tính đồng dư: ; Nếu thì ; Nếu và thì ; Nếu , thì , ; Như vậy, ta có thể tự do thực hiện các phép tính số học thông thường trên tập . Nếu là một phần tử trong và thì tồn tại các số sao cho , tức là , nên người ta nói có nghịch đảo (trong ) là , và thường ký hiệu phần tử nghịch đảo này là , hay . Định lý Fermat (bé)[2]: Nếu là một số nguyên tố còn là một số nguyên thì . Nếu không chia hết cho (tức là ) thì . Ví dụ. Dễ dàng thấy rằng ; ; . Thặng dư bình phương [1] Cho số nguyên tố . Số nguyên được gọi là thặng dư bình phương nếu như tồn tại số nguyên thỏa mãn phương trình . Ký hiệu Legendre [1] Với số nguyên tố và số nguyên bất kỳ người ta ký hiệu Và chỉ ra rằng sẽ bằng 0 khi chia hết cho , bằng 1 khi là một thặng dư bình phương và bằng -1 trong trường hợp còn lại. Có thể mở rộng khái niệm ký hiệu trên ra cho trường hợp không phải là nguyên tố, nhưng chỉ xét những số trong tập thặng dư rút gọn của (tức là những thặng dư nguyên tố cùng nhau với ). Ký hiệu Jacobi [1] Với số nguyên , trong đó , , là các số nguyên tố, còn nằm trong tập thặng dư rút gọn của , ta ký hiệu . Như vậy trong trường hợp riêng khi là số nguyên tố thì ký hiệu Jacobi trùng với ký hiệu Legendre. 2.2. Việc tính toán số nguyên tố và khái niệm số giả nguyên tố. Kiểm tra số giả nguyên tố mạnh. 2.2.1. Thuật toán kiểm tra số nguyên tố thông thường và khái niệm số giả nguyên tố Thuật toán: Sàng Eratosthenes [2] Để kiểm tra có phải là số nguyên tố hay không, ta thực hiện phép chia cho tất cả các số nguyên tố không vượt quá . Độ phức tạp: Theo định lý số nguyên tố của Gauss, số các số nguyên tố không vượt quá là vào khoảng . Để chia cho , ta cần phép tính bít. Như vậy, nếu vào cỡ khoảng 100 chữ số thập phân, số các phép tính bit phải dùng sẽ vào cỡ . Với những máy tính thực hiện một triệu phép tính một giây, thời gian cần thiết sẽ vào khoảng năm! Điều này dẫn đến một phương án khác thay thế: số giả nguyên tố. Số giả nguyên tố [2] Theo định lý Fermat, nếu là số nguyên tố và là số nguyên tùy ý, thì . Do đó nếu tồn tại số sao cho thì phải là hợp số. Như vậy, nếu một số nguyên thỏa mãn các giả thiết của định lý Fermat bé thì “có nhiều khả năng” nó là một số nguyên tố! Ta có định nghĩa sau: Giả sử là một số nguyên dương. Nếu là hợp số nguyên dương và , thì được gọi là số giả nguyên tố cơ sở . Nói chung các số giả nguyên tố ít hơn nhiều so với các số nguyên tố. Chẳng hạn, có tất cả 455052512 số nguyên tố bé hơn , nhưng chỉ có 14884 số giả nguyên tố cơ sở 2 trong khoảng đó. Sự kiện này giải thích cách nói ở trên: Các số thỏa mãn định lý Fermat bé có nhiều khả năng là số nguyên tố. 2.2.2. Kiểm tra số giả nguyên tố mạnh Kiểm tra Miller [2] Giả sử là số nguyên dương lẻ, , trong đó là số nguyên không âm, là số nguyên dương lẻ. Ta nói trải qua được kiểm tra Miller cơ sở , nếu , hoặc , với nào đó, . Số nguyên được gọi là giả nguyên tố mạnh cơ sở nếu nó là hợp số và trải qua được kiểm tra Miller cơ sở . Cách làm trên có thể kiểm tra nguyên tố những số không lớn lắm. Đối với những số lớn, ta có thể dùng thuật toán xác suất dựa trên định lý : Nếu là một hợp số dương lẻ thì tồn tại không quá , , sao cho trải qua được kiểm tra Miller đối với các cơ sở đó. Từ định lý trên suy ra rằng, nếu số được chọn ngẫu nhiên trong khoảng thì trải qua kiểm tra Miller cơ sở với xác suất bé hơn . Như vậy, nếu ta chọn số ngẫu nhiên thì xác suất để trải qua kiểm tra Miller đối với cơ sở đó sẽ bé hơn . Khi đủ lớn, với dụ , xác suất đó quá nhỏ, nên với trải qua 20 cơ sở ngẫu nhiên thì có thể tin “gần chắc chắn” rằng là số nguyên tố. Từ đó ta có thuật toán xác suất sau: Thuật toán Miller-Rabin [9], [11] RGB là bộ sinh bít ngẫu nhiên Input: 1. The odd integer to be tested for primality. This will be either or , or one of the auxiliary primes or . 2. The number of iterations of the test to be performed; the value shall be consistent with Table 3 or 4. Output: 1. The status returned from the validation procedure, where status is either PROBABLY PRIME or COMPOSITE. Process: 1. Let be the largest integer such that divides . 2. . 3. . 4. For to do 4.1 Obtain a string of bits from an RBG. Comment: Ensure that . 4.2 If , then go to step 4.1. 4.3 . 4.4 If , then go to step 4.7. 4.5 For to do 4.5.1 . 4.5.2 If , then go to step 4.7. 4.5.3 If , then go to step 4.6. 4.6 Return COMPOSITE. 4.7 Continue. Comment: Increment for the do- loop in step 4. 5. Return PROBABLY PRIME. Mã code cụ thể của thuật toán này xem ở phần phụ lục. Thuật toán Miller-Rabin nâng cao [9]: cung cấp thêm thông tin chi tiết khi gặp một lỗi, có thể hữu dụng khi sinh và xác thực số nguyên tố trong mã hóa khóa công khai RSA. RGB là bộ sinh bít ngẫu nhiên Input: 1. The odd integer to be tested for primality. This will be either or , or one of the auxiliary primes or . 2. The number of iterations of the test to be performed; the value shall be consistent with Table 3 or 4. Output: 1. The status returned from the validation procedure, where status is either PROBABLY PRIME, PROVABLY COMPOSITE WITH FACTOR (returned with the factor), and PROVABLY COMPOSITE AND NOT A POWER OF A PRIME. Process: 1. Let be the largest integer such that divides . 2. . 3. . 4. For to do 4.1 Obtain a string of bits from an RBG. Comment: Ensure that . 4.2 If , then go to step 4.1. 4.3 . 4.4 If , then return PROVABLY COMPOSITE WITH FACTOR and the value of . 4.3 . 4.4 If , then go to step 4.15. 4.7 For to do 4.7.1 Comment: and 4.7.2 4.7.3 If , then go to step 4.15. 4.7.4 If , then go to step 4.12. 4.8 Comment: and 4.9 . 4.10 If , then go to step 4.12. 4.11 Comment: and . 4.12 . 4.13 If , then return PROVABLY COMPOSITE WITH FACTOR and the value of g 4.14 Return PROVABLY COMPOSITE AND NOT A POWER OF A PRIME. 4.15 Continue. Comment: Increment for the do- loop in step 4. 5. Return PROBABLY PRIME. Hai thuật toán trên có số vòng lặp (iterations) được xác định dựa theo bảng sau: Bảng 2.1: Số vòng lặp tối thiểu trong thuật toán Miller-Rabin khi sinh số nguyên tố sử dụng trong hệ mã RSA [9] Các số nguyên tố Số vòng lặp > 100 bits và : 512 bits Xác suất lỗi Cho : 28 Cho và : 5 > 140 bits và : 1024 bits Xác suất lỗi Cho : 38 Cho và : 5 > 170 bits và : 1536 bits Xác suất lỗi Cho : 41 Cho và : 4 Bảng 2.2: Số vòng lặp tối thiểu trong thuật toán Miller-Rabin khi sinh số nguyên tố sử dụng trong hệ mã RSA với xác suất lỗi là [9] Các số nguyên tố Số vòng lặp > 100 bits và : 512 bits Cho : 38 Cho và : 7 > 140 bits và : 1024 bits Cho : 32 Cho và : 4 > 170 bits và : 1536 bits Cho : 27 Cho và : 3 Ngoài ra còn có thuật toán Lucas để kiểm tra xác suất tính nguyên tố (trong FIPS 186-3) có liên quan đến ký hiệu Jacobi được trình bày ở trên. Thuật toán Lucas [9], [11] Input: The candidate odd integer to be tested for primality. Output: Where status is either PROBABLY PRIME or COMPOSITE. Process: Find the first D in the sequence for which the Jacobi symbol . If for any in the sequence, return (COMPOSITE). Let be the binary expansion of , with . Set and . For to do . . If then . . Else . . If then return (PROBABLY PRIME). Otherwise, return (COMPOSITE). Bước 5.2, 5.3.1 và 5.3.2 có biểu thức dưới dạng , trong đó là số nguyên, và là số nguyên lẻ. Nếu không nguyên (do lẻ), thì có thể được tính bằng . Một cách khác, , với mọi giá trị A nguyên. Mã code cụ thể của thuật toán Lucas xem ở phần phụ lục. Nhận xét Một số giả nguyên tố sau khi qua được 2 kiểm tra là thuật toán Miller-Rabin và Lucas thì có thể tin tưởng là mạnh [11], đồng nghĩa với việc xác suất để nó không phải số nguyên tố là rất thấp. 2.2.3. Tính nguyên tố mạnh của một số Một số nguyên tố được gọi là mạnh khi nó thỏa mãn các tính chất như sau [10], [12]: lớn. có thừa số nguyên tố lớn. Nghĩa là, với nào đó và là số nguyên tố lớn. có thừa số nguyên tố lớn. Nghĩa là, với nào đó và là số nguyên tố lớn. có thừa số nguyên tố lớn. Nghĩa là, với nào đó và là số nguyên tố lớn. Đôi khi một số nguyên tố chỉ cần thỏa mãn một số trong các trường hợp trên cũng được gọi là mạnh. Trong trường hợp của bài toán, các điều kiện để một cặp số nguyên tố là mạnh được đề cập đến ở bảng sau: Bảng 2.3. Điều kiện của các số nguyên tố thành phần [10] Độ dài tối thiểu của Độ dài tối đa của , 1024 > 100 bits < 496 bits 2048 > 140 bits < 1007 bits 3072 > 170 bits < 1518 bits Trong đó lần lượt là các thừa số nguyên tố của ; là độ dài của modulo tính theo bit; là độ dài của số tính theo bit. Mã code của phần kiểm tra số nguyên tố mạnh xem ở phục lục. 2.3. Chìa khóa an toàn Để một chìa khóa của hệ mã RSA được gọi là an toàn theo tiêu chuẩn của FIPS 186-3 (Federal Information Processing Standard được ban hành bởi U.S. National Institute of Standards and Technology (NIST)) nó phải thỏa mãn các điều kiện sau [9]: i. Số mũ công khai phải thỏa mãn: - Phải được chọn trước để tạo ra và . - Là 1 số nguyên dương lẻ thỏa mãn: . - Có thể là số định sẵn hoặc được chọn ngẫu nhiên. ii. Hai số và phải thỏa mãn: - và sẽ nguyên tố cùng nhau với . - . - . - , là độ dài theo bit của . iii. Sau khi sinh ra và , số mũ bí mật được chọn phải thỏa mãn: - Là 1 số nguyên dương và . - , với là ước chung lớn nhất của và . - Nếu thì phải được chọn lại. Số có thể được chọn lại nhưng không cần thiết. Chương 3. Tính toán song song 3.1. Xử lý song song, cơ hội và thách thức [8] Giới thiệu: Thời đại xử lý song song Máy tính cá nhân đã được cải tiến đáng kể trong 30 năm qua. Tăng trưởng theo cấp số mũ trong sức mạnh xử lý đã biến đổi việc quản lý thông tin và năng suất làm việc cá nhân, và đã mở rộng khả năng của máy tính lên rất lớn. Năng lực máy tính có thể xử lý nhiều dữ liệu hơn, nhanh hơn, và với đồ họa phong phú đã biến đổi rất nhiều ở các ngành kinh doanh, khoa học, và y học. Khả năng thu giữ âm thanh, video, và đồ họa ba chiều chất lượng cao trong các môi trường có liên kết đã thay đổi các lĩnh vực giải trí, giáo dục, và truyền thông. Cho đến gần đây, các ứng dụng này đã tăng trưởng nhanh hơn và đáp ứng nhiều hơn nhu cầu xã hội, đồng thời được nhân rộng với sự xuất hiện của bộ vi xử lý nhanh mà không yêu cầu các nhà phát triển phần mềm tìm hiểu mô lập trình mới. Tuy nhiên, sự phát triển của xử lý tuần từ đã đạt đến mức bão hòa vì bộ xử lý đã tiếp cận đến các giới hạn vật lý. Định luật Moore về việc tăng gấp đôi mật độ bóng bán dẫn hai năm một lần vẫn tiếp tục, nhưng tính hiệu quả của Luật Moore không thể được áp dụng tiếp tục trong tần số đồng hồ. Thay vào đó, bộ xử lý hiện nay đang tiến triển theo một mô thức mới mà đa lõi được ưu tiên hàng đầu để tăng xử lý tính toán. Các ứng dụng xử lý tuần tự mà trước đây có lợi thế do chạy trên các bộ xử lý nhanh đã không thấy phát triển giống như số mức độ tăng của nhân xử lý. Để khai thác triệt để sức mạnh của các hệ thống nhiều lõi, các ứng dụng phải được thiết kế lại, phân chia thành các phần có thể tính toán song song, và phân phối đều trên toàn số lõi có sẵn. Nhưng viết các dòng mã song song không hề đơn giản cho các ngôn ngữ lập trình, công cụ phát triển, và thậm chí cả phần lớn các nhà phát triển. Ngày nay, các nhà phát triển nhìn chung được đào tạo để viết mã nối tuần tự - song song đòi hỏi một tư duy về lập trình khác nhau. Đáp lại, ngành công nghiệp phát triển phần mềm đang có những bước tiến hiện thực hóa song song cho các nhà phát triển dễ tiếp cận hơn, và Microsoft đang giúp đỡ để tìm lối đi. Microsoft thông báo rằng đã thiết lập nền móng cho việc xử lý song song nhằm khai thác sức mạnh tính toán của các kiến trúc đa lõi. 3.1.1. Cơ hội Lập trình song song cung cấp các cơ hội to lớn cho khả năng mở rộng của cả thời gian đáp ứng và năng lực. Với xử lý song song, một vấn đề lớn, phức tạp, có thể được chia thành các vấn đề nhỏ hơn và xử lý nhanh hơn nhờ sức mạnh làm việc song song của đa lõi. Như vậy, nhiều khía cạnh của đời sống thực có thể áp dụng xử lý song song, như: Kinh tế tri thức (Business Intelligence: BI) Các bản báo cáo và phân tích thường sử dụng thủ tục phân tích trong đó có việc lặp lại mô hình với dữ liệu lớn. Song song hóa các thủ tục này có các báo cáo nhanh hơn và chất lượng cao hơn. Vì dữ liệu BI thường đến từ một máy chủ nên nếu sử dụng một mô hình song song trong đó tập hợp các dữ liệu từ nhiều nguồn khác nhau sẽ giúp người sử dụng truy cập vào các kết quả nhanh hơn. Điều này còn làm cho người sử dụng có thể có các kết quả khác có liên quan và chính xác hơn về thời gian. Đa phương tiện Tính toán song song có thể đem đến nhiều lợi ích cho các thế hệ tiếp theo của hệ thống xử lý đa phương tiện. Các ứng dụng đa phương tiện hiện tại thường dựa vào mô hình lập trình tuần tự để thực hiện các thuật toán mà có thể được song song hóa ở mức độ cao. Thông qua việc sử dụng các kỹ thuật tính toán song song và xử lý đa lõi, dữ liệu đa phương tiện có thể được xử lý bằng các thuật toán song song, giảm thời gian xử lý tổng thể. Tài chính Song song máy tính có thể giảm nguy cơ trong lĩnh vực tài chính bằng cách cho người sử dụng truy cập nhanh hơn với thông tin tốt hơn. Ví dụ, lựa chọn cổ phiếu đại diện để bắt chước hiệu suất của một chỉ số tài chính lớn hơn liên quan đến việc tối ưu hoá chuyên sâu hơn một số lượng lớn dữ liệu trước đó. Song song quá trình này vì thế có thể dẫn đến hiệu năng tăng đáng kể. Với tính toán song song, có thể xem xét một loạt các thông số như thay đổi theo thời gian cho một tập hợp các công cụ tài chính. Nhiều khía cạnh của cùng một vấn đề có thể được gửi đến các lõi xử lý. 3.1.2. Những thách thức: Các vấn đề khó khăn gặp phải khi xử lý song song Các nhà phát triển cần xây dựng các ứng dụng song song có hiệu quả và đáng tin cậy để chia sẻ tài nguyên hệ thống. Tuy nhiên, song song thông qua các mô hình lập trình đa luồng truyền thống ngày nay là khó thực hiện và dễ bị lỗi trừ các ứng dụng đơn giản nhất. Để viết code song song hiệu quả, một nhà phát triển phải thực hiện hai chức năng chính: xác định khả năng cho xử lý song song vấn đề và ánh xạ các mã tới các phần cứng đa lõi. Cả hai chức năng là tốn thời gian, khó khăn, và dễ bị lỗi, vì có rất nhiều các yếu tố phụ thuộc để theo dõi, chẳng hạn như bộ nhớ và lập kế hoạch bố trí cân bằng các lõi. Hơn nữa, các ứng dụng song song có thể được kiểm tra, gỡ lỗi, và phân tích về tính chính xác của các chức năng, do đó chúng thường xuyên bị phát hiện các lỗi tinh tế và các vấn đề hiệu suất của chương trình. Các công cụ gỡ lỗi và thiết kế xây dựng các ứng dụng trên máy tính để lõi đơn gặp khó khăn khi phải đối mặt với những thách thức như vậy trong xử lý trên nhiều lõi. Một số thách thức, hoặc các vấn đề khó khăn phải được giải quyết trước khi song song có thể được triển khai rộng rãi hơn, bao gồm: Làm thế nào để thể hiện và khai thác được xử lý song song. Làm thế nào để phối hợp các truy cập song song tới trạng thái chung. Làm thế nào để kiểm tra tính đúng đắn, gỡ lỗi chương trình và tăng hiệu suất. Cụ thể hơn: Thể hiện và khai thác được xử lý song song Xử lý song song bởi nhiều lõi có một nhiệm vụ là lấy một công việc và phân chia nó thành các công việc con mà độc lập với nhau, và sau đó có thể được xử lý bởi các lõi. Sau đó, các chức năng cơ bản của các ngôn ngữ lập trình là để mô tả nhiệm vụ thực hiện dựa trên trình tự các công việc con. Khả năng để xác định việc thực hiện đồng thời các công việc con là một mô hình lập trình mới, vì vậy, nó đòi hỏi một sự thay đổi cơ bản trong phương pháp lập trình. Chúng ta gọi đây là “fine-grained concurrency” để làm nổi bật sự thay đổi sâu sắc này với những tính toán đồng thời khác, ví dụ như quản lý không đồng bộ vào ra (asynchronous I /O). Viết chương trình thể hiện và khai thác “fine-grained concurrency” vốn khó khăn hơn so với viết chương trình tuần tự bởi các khái niệm, tư tưởng mới mà lập trình viên phải nắm được và những đặc tính của xử lý song song được thể hiện trên chương trình. Đứng đầu trong số những vấn đề này là không lường trước được nguy cơ gây ra lỗi khi tương tác giữa các đối tượng mà bộ nhớ được chia sẻ và những khó khăn khi chứng minh rằng không có lỗi như thế tồn tại trong một chương trình. Để sử dụng lại code và để tối đa hóa lợi ích của việc song song, các lập trình viên cần đảm bảo rằng việc tính toán song song bên trong các thành phần không không liên quan đến đặc tả giao diện bên ngoài. Khi các thành phần mới được phát triển có thể khai thác được xử lý song song, chúng có thể thay thế các thành phần cũ trong khi vẫn giữ tất cả các giao diện ứng dụng người dùng. Không xây dựng cấu trúc khi tính toán song song có thể khiến lỗi gặp phải trở nên trầm trọng hơn. Ngoài ra, khi thành phần con của chương trình có thể được song song hóa thoải mái, một hệ thống phần cứng có thể phải xử lý song song nhiều hơn cần thiết trong sử dụng các tài nguyên sẵn có. Các nhà phát triển (hoặc các chương trình ứng dụng) phải có khả năng quản lý các nhu cầu về tài nguyên hệ thống của các thành phần chương trình khác nhau. Phối hợp truy cập song song tới trạng thái được chia sẻ Vấn đề khó khăn thứ hai cho các nhà lập trình song song bao gồm việc quản lý các biến được chia sẻ và bị thay đổi bởi các công việc (tasks) trong một ứng dụng. Lập trình viên cần có sự trừu tượng hóa tốt hơn so với những gì hiện có để phối hợp truy cập ứng dụng song song tới trạng thái chung; họ cũng cần có cách làm tốt hơn để xây dựng tài liệu và hạn chế những ảnh hưởng xấu của các hàm chức năng tới trạng thái của ứng dụng. Kết hợp các mô hình tính toán song song sang các ngôn ngữ lập trình phổ biến, chẳng hạn như C + +, C #, và Microsoft Visual Basic, không phải là dễ dàng. Một cách đơn giản là tăng thêm các cơ chế đồng bộ hóa trong các ngôn ngữ như ổ khóa và các biến sự kiện nhằm thông tin về mục mới của lỗi không có trong ngôn ngữ cơ bản. Bất kỳ giải pháp nào cho vấn đề tính toán song song phải giải quyết ba vấn đề riêng biệt: Trật tự sắp xếp của các tính toán nhỏ. Tập hợp các cập nhật chưa được sắp xếp tới trạng thái chia sẻ (ví dụ biến dùng chung). Việc quản lý các nguồn tài nguyên được chia sẻ. Kiểm tra và gỡ lỗi, tính đúng đắn và hiệu suất Một vấn đề khó khăn thứ ba là kiểm tra tính đúng đắ, gỡ lỗi và hiệu suất chương trình. Xử lý song song có thêm các yêu cầu trên tất cả các giai đoạn phát triển của ứng dụng. Lịch trình kết quả phụ thuộc vào khả năng có thể làm xử lý theo mũ hay không. Không thể áp dụng các cách gỡ lỗi của chương trình ứng dụng lập trình tuần tự cho các chương trình được xử lý song song. Một vấn đề phức tạp hơn là việc kiểm soát lượng lớn các trạng thái, các biến dùng chung của hệ thống. Với hàng trăm công việc con được chạy trong tiến trình, không thể xác định rõ ràng chương trình chạy đang ở giai đoạn nào hoặc những trạng thái của nó đang được cập nhật đến đâu. Tính toán song song cũng giới thiệu cái nhìn mới cho những vấn đề về phân tích và điều chỉnh khả năng chạy của chương trình, đồng thời nhấn mạnh về vấn đề này. Ngoài một số thao tác đơn giản, một chương trình được lập trình song song bây giờ phải quan tâm về số lượng xử lý đồng thời, các chí phí liên quan đến xử lý ấy, và khả năng xung đột khi các hoạt động đồng thời cùng lúc truy cập vào dữ liệu được chia sẻ. Đây là tất cả những vấn đề mới mà lập trình viên tuần tự chưa gặp phải. 3.1.3. Giải pháp: Các công nghệ song song trong Visual Studio 2010 Microsoft Lời mở đầu Việc chuyển đổi sang lập trình song song trên nhiều nhân là cả cơ hội và khó khăn cho cả nhà phát triển và các doanh nghiệp. Nếu không có các công cụ cải tiến và công nghệ, các nhà phát triển có thể phải gặp nhiều khó khăn hơn trong các mô hình tạo ra mã song song để tạo ra giá trị hiệu quá. Thời gian được dùng trong việc tạo ra những ứng dụng song song cho người dùng để giải quyết nhiều vấn đề đồng thời có thể rất lâu. Điều này làm giảm năng suất phát triển và loại bỏ sự hữu ích của chương trình ứng dụng. Để đáp lại, Microsoft cung cấp một giải pháp với Visual Studio 2010, dựa trên bốn mục tiêu: Loại bỏ sự phức tạp khi viết mã song song của các nhà phát triển để giúp họ tập trung vào giải quyết các vấn đề quan trọng, do đó tăng năng suất làm việc. Đơn giản hóa quá trình viết các ứng dụng song song. Có một giải pháp tiếp cận toàn diện, cung cấp các giải pháp đi từ xử lý các nhiệm vụ đồng thời đến xử lý dữ liệu song song. Chú trọng đến nhu cầu của các nhà phát triển. Tổng quan Microsoft Visual Studio 2010 đã đối mặt với những vấn đề khó khăn trong tính toán song song, hỗ trợ lập trình ở mức cao hơn với các cấu trúc trừu tượng giúp các nhà phát triển tạo ra các cách song song hợp lý và ánh xạ nó đến phần cứng. Visual Studio 2010 cũng bao gồm các công cụ phát triển tiên tiến hỗ trợ các kiến trúc lập trình, sửa lỗi ứng với cách xử ly song song được thể hiện trong mã. Hình 3.1: Công nghệ song song có trong Visual Studio 2010 [8]. 3.2. Lập trình song song với Visual Studio 2010 [8] 3.2.1. Thư viện Đối với việc xây dựng và thực hiện các ứng dụng song song, Visual Studio 2010 có các thư viện mới cho phát triển các ứng dụng với C++ như: Parallel Pattern Library (PPL). Concurrency Primitives and Algorithms Concurrency Containers Asynchronous Agents Library. Asynchronous Agents Messaging Blocks Parallel Extensions to the Microsoft .Net Framework. Parallel LINQ (PLINQ) Task Parallel Library (TPL) Chúng ta sẽ đề cập chi tiết hơn về thư viện Parallel Extensions vì nó được sử dụng để tạo ra chương trình sinh khóa. Parallel Extensions Là một sự bổ sung cho các thư viện của Microsoft .NET Framework. Nó có cấu trúc song song ở cấp cao cho các ứng dụng quản lý, bao gồm: Parallel LINQ (PLINQ). Một mô hình khai báo cho dữ liệu song song dựa trên Language Integrated Query (LINQ). Task Parallel Library (TPL). Một mô hình cho cả nhiệm vụ và dữ liệu song song dựa trên mô hình song song rõ ràng, chẳng hạn như nhiệm vụ và tương lai, và cấu trúc song song, như Parallel.For. Coordinations Data Structures (CDS). Một tập hợp của các thao tác phối hợp và đồng bộ hóa để đơn giản hóa kết nối và các mẫu khởi tạo. Parallel Extensions hướng đến các nhà phát triển sử dụng bất kỳ ngôn ngữ. NET nào, chẳng hạn như C #, Visual Basic, C + + / CLI, và F #. Paralle Extensions khiến mọi việc trở nên dễ dàng khi tự động song song hóa các truy vấn từ LINQ đến đối tượng, đạt được độ tăng tốc đáng kể với những thay đổi rất ít đến cơ sở mã hiện có của các nhà phát triển. Task Parallel Library đơn giản hóa việc giới thiệu dữ liệu và song song các nhiệm vụ (task) vào một ứng dụng, thông qua các cấu trúc song song của vòng lặp hoặc thông qua song song của thuật toán phức tạp hơn sử dụng fine-grained. 3.2.2. Các mô hình lập trình song song và ví dụ Visual Studio 2010 hỗ trợ ba mô hình chính để thể hiện các tính toán song song: Data Parallelism Parallel Loops (vòng lặp song song) Ví dụ: concurrent_vector Query(vector stocks) { concurrent_vector results; parallel_for_each(stocks.begin(), stocks.end(), [&](StockQuote stock) { if (stock.marketCap > 100000000000.0 && stock.changePct < 0.025 && stock.volume > 1.05 * stock.volumeMavg3M) { results.push_back(stock); } }); return results; } PLINQ Ví dụ: IEnumerable Query(IEnumerable stocks) { return from stock in stocks.AsParallel() where stock.MarketCap > 100000000000.0 && stock.ChangePct < 0.025 && stock.Volume > 1.05 * stock.VolumeMavg3M select stock; } Task Parallelism Parallel Invoke Tuần tự: void quicksort(int * a, int n) { if (n <= 1) return; int s = partition(a,n); quicksort(a,s); quicksort(a+s,n-s); } Song song: void quicksort(int * a, int n) { if (n <= 1) return; int s = partition(a,n); parallel_invoke( [&]{quicksort(a,s);}, [&]{quicksort(a+s,n-s);}); } Tasks (các nhiệm vụ) Ví dụ: void quicksort(int * a, int n) { if (n <= 1) return; int s = partition(a,n); task_group tasks; tasks.run([&]{quicksort(a,s);}); tasks.run([&]{quicksort(a+s,n-s);}); tasks.wait(); } Data Flow Parrallelism Futures var symbols = new [] { "MSFT", "INTL", "AAPL", "GOOG" }; var prices = new Dictionary>(symbols.Length); foreach(var symbol in symbols) { prices.Add( symbol, Task.Factory.StartNew( () => GetPrice( symbol ) ) ); } Continuations var c = Task.Factory.StartNew(() => A()) .ContinueWith(a => B(a.Result)) .ContinueWith(b => C(b.Result)); Messaging blocks and asynchronous agents (truyền khối tin và các agent không đồng bộ) HRESULT LogChunkFileParser::ParseFile(){     unbounded_buffer* MsgBuffer =         new unbounded_buffer();     // Parsing agent      AgentTask* pParserAgent = new AgentTask([&]{       AgentMessage msg;       while((msg = receive(MsgBuffer))->type != EXIT)       {         Parse(msg->pCurrentLine);         delete msg->pCurrentLine;       }     });     pParserAgent->start();     // Read the file     HRESULT hr = S_OK;     WCHAR* wszLine;     hr = reader->OpenFile(pFileName);     if (SUCCEEDED(hr)){        while(!reader->EndOfFile()){           wszLine = new WCHAR[MAX_LINE];           // Read the next line...           hr = reader->ReadLine(wszLine, MAX_LINE);           if (SUCCEEDED(hr)){              // ... and parse it                                 send(MsgBuffer, AgentMessage(wszLine));           }         }         send(MsgBuffer, AgentMessage(EXIT));         hr = agent::wait(&pParserAgent);     }     return hr; Hình 3.2: Kiến trúc lập trình song song trong .Net Frame Work 4.0 [8]. 3.2.3. Kết luận Cải tiến phần mềm trong tương lai phần lớn sẽ xoay quanh sự tận dụng lợi thế của vi xử lý nhiều lõi thông qua tính toán song song. Ngành công nghiệp phát triển phần mềm đang có những bước tiến để hiện thực hóa song song sao cho dễ tiếp cận hơn và khả thi cho tất cả các nhà phát triển. Các giải pháp toàn diện có trong Microsoft Visual Stuio 2010 hỗ trợ xử lý song song đa lõi từ bên trong hệ điều hành đến các chương trình ứng dụng. Những công nghệ này cho phép phát triển các ứng dụng và thư viện với khả năng xử lý song song trên quy mô rộng với bộ xử lý đa lõi và tốc độ xử lý sẽ vẫn tiếp tục phát triển đi đôi với tốc độ phát triển của lõi xử lý theo cấp số nhân trong tương lai. Chương 4. Kết quả triển khai và tính thử nghiệm 4.1. Giới thiệu về chương trình ứng dụng 4.1.1. Mục đích và hoạt động của chương trình Mục đích Chương trình tạo ra với mục đích sinh khóa cho hệ thống cấp phát chứng thực số. Cụ thể hơn sinh cặp số nguyên tố mạnh - là yếu tố chủ chốt trong việc sinh khóa hệ mã RSA được ứng dụng của hệ thống CA. Mô tả hoạt động Đầu vào Số N: số cặp sẽ được sinh ra sau khi chương trình chạy xong. Quá trình xử lý sinh một cặp số Chương trình sử dụng hàm khởi tạo class mới RSACryptoServiceProvider có namespace System.Security.Cryptography. Về thực chất việc tạo ra class mới trên chính là sinh ra một chìa khóa RSA mà trong đó có các thành phần như . Chuyển 2 số từ dạng dữ liệu byte[] sang kiểu BigInteger (class số nguyên lớn trong System.Numerics). Sau đó với từng số kiểm tra các test. Kiểm tra số theo: thuật toán Miller-Rabin xác suất lỗi và thuật toán Lucas. Kiểm tra số theo: thuật toán Miller-Rabin xác suất lỗi và thuật toán Lucas. Kiểm tra điều kiện ràng buộc giữa và để chìa khóa RSA trên là an toàn theo chuẩn FIPS 186-3. Kiểm tra tính nguyên tố mạnh của : tìm các thừa số nguyên tố lần lượt của và kiểm tra độ dài tính theo bit của chúng dựa trên bảng 2.3. Các kiểm tra Miller-Rabin, Lucas, và tính nguyên tố mạnh là do bản thân em tự code dựa theo hướng dẫn thuật toán ở phần 2.2.2, 2.2.3, và 2.3. Phân công song song khi sinh N cặp Sử dụng vòng lặp song song Parallel.For trong namespace System.Threading.Tasks đi từ 0 đến N-1 bên ngoài quá trình xử lý sinh một cặp số ở trên. Các công việc cụ thể được tự động chia đều lên số lõi hiện có. Ngoài ra trong quá trình kiểm tra tính nguyên tố mạnh của có bước tìm các thừa số nguyên tố lần lượt của . Các bước này là độc lập nên đã được song song bằng lệnh Parallel.Invoke. Đầu ra Đầu ra của chương trình là cặp số thỏa mãn các điều kiện là số giả nguyên tố có xác suất lỗi rất thấp (giả nguyên tố mạnh) và đồng thời có tính chất mạnh theo nghĩa số khó bị hacker phân tích ra các thừa số nguyên tố vụn khi được dùng làm khóa. Chương trình thông báo số cặp đã được sinh bằng thư viện C# không thỏa mãn kiểm tra Miller-Rabin và Lucas, không thỏa mãn điều kiện nguyên tố mạnh. Ngoài ra, chương trình còn thông báo thời gian chạy của chương trình có sai số (trong điều kiện không lý tưởng là vì trong quá trình chương trình chạy còn có các tiến trình khác của hệ điều hành cũng đang chạy). 4.1.2. Một số hình ảnh về chương trình Giao diện chính Hình 4.1: Giao diện của chương trình Trong đó: là số cặp sẽ được sinh ra Button Generate Sequently để kích hoạt sự kiện sinh các cặp số nguyên tố được lập trình tuần tự. Button Generate Parallelly để kích hoạt sự kiện sinh các cặp số nguyên tố được song song. Button Show để thể hiện 1 cặp số nguyên tố ra màn hình theo thứ tự lần lượt sau mỗi lần bấm. Các thông báo của chương trình Hình 4.2: Số cặp đã bị loại vì không thỏa mãn kiểm tra xác suất tính nguyên tố. Hình 4.3: Số cặp đã bị loại vì không thỏa mãn điều kiện để là số nguyên tố mạnh. Hình 4.4: Thời gian chạy của chương trình. Hình 4.5: Hình ảnh của CPU khi sinh số nguyên tố một cách tuần tự. Hình 4.6: Hình ảnh của CPU khi sinh số nguyên tố một cách song song. Ta có thể thấy lập trình song song tận dụng triệt để tài nguyên của hệ thống, đặc biệt hiệu quả cao khi có một máy tính đa lõi chuyên dùng cho việc sinh khóa. 4.2. Một số thống kê khi chạy chương trình trên chip intel core2duo 2.2 GHZ Bảng 4.1: Thống kê khi sinh 2 cặp p, q Số thứ tự Xử lý tuần tự Xử lý song song Số cặp không qua được Miller-Rabin và Lucas test Số cặp không qua được điều kiện nguyên tố mạnh Thời gian chạy (tính theo giây) Số cặp không qua được Miller-Rabin và Lucas test Số cặp không qua được điều kiện nguyên tố mạnh Thời gian chạy (tính theo giây) 1 16 8 10 45 24 25 2 68 38 40 25 18 16 3 16 12 11 55 41 26 4 24 17 17 18 16 9 5 25 23 19 35 19 14 Tổng 149 98 97 178 118 90 Với xử lý tuần tự: 2 + 149 + 98 = 249 cặp trong 97 giây. Với xử lý song song: 2 + 178 + 118 = 398 cặp trong 90 giây ~ 249 cặp trong 56.3 giây. Nhận xét: Như vậy, thời gian xử lý song song trong thống kê này giảm xuống đáng kể (còn ~0.6 lần) so với xử lý tuần tự. Có thể đi đến kết luận: thời gian xử lý tỷ lệ nghịch với số lõi. Điều đó cho thấy hiệu quả về mặt thời gian của xử lý song song. PHỤ LỤC A. Thuật toán Miller-Rabin bool satisfyMillerRabinTest(BigInteger bigP) { // Miller-Rabin algorithm test on prime bigP BigInteger bigP1 = bigP - 1; BigInteger m = bigP1; BigInteger b = new BigInteger(); int a = 0; int wlen = 64; byte[] byteB = new byte[wlen]; while (m % 2 == 0) // find largest number a to have bigP1 divides 2^a; { ++a; m = m / 2; } RNGCryptoServiceProvider random = new RNGCryptoServiceProvider(); // class random number int iterations = 7; for (int i = 0; i < iterations; i++) { // start testing while (true) { random.GetBytes(byteB); // random number b b = transform(byteB); // transform b from byte[] to big integer if (b > 1 && b < bigP1) break; } BigInteger z = BigInteger.ModPow(b, m, bigP); // equals to b ^ m mod bigP if (z.Equals(1) || z.Equals(bigP1)) continue; for (int j = 0; j < a - 1; j++) { z = BigInteger.ModPow(z, 2, bigP); // equals to z ^ 2 mod bigP if (z.Equals(bigP1)) continue; if (z.Equals(1)) return false; } return false; } return true; } B. Thuật toán Lucas bool satisfyLucasTest(BigInteger c) { // Lucas algorithm test on prime c BigInteger d = 5; int distance = - 2; while (true) { // find number d satisfy that jacobi(d, c) = -1 BigInteger r = BigInteger.ModPow(d, (c - 1) / 2, c); // equals to (d ^ (c-1)/2) mod c if (r.IsZero) return false; if (!r.Equals(1)) break; // if value of jacobi(d,c) is -1, break; d = d * (-1) + distance; distance *= (-1); } BigInteger k = c + 1; List listK = new List(); listK.Clear(); while (k > 0) { // binary expansion of k stored in listK BigInteger r = k % 2; listK.Add((int)r); k = k / 2; } BigInteger u = 1, v = 1; BigInteger uTemp, vTemp; for (int i = listK.Count - 2; i >= 0; i--) { // start testing uTemp = (u * v) % c; BigInteger tmp = d * u * u + v * v; if (!tmp.IsEven) vTemp = ((tmp + c) / 2) % c; else vTemp = (tmp / 2) % c; if (listK.ElementAt(i) == 1) { tmp = uTemp + vTemp; if (tmp.IsEven) u = (tmp / 2) % c; else u = ((tmp + c) / 2) % c; tmp = vTemp + d * uTemp; if (tmp.IsEven) v = (tmp / 2) % c; else v = ((tmp + c) / 2) % c; } else { u = uTemp; v = vTemp; } } if (u.IsZero) return true; // satisfied else return false; // not satisfied } C. Thuật toán kiểm tra nguyên tố mạnh bool satisfyStrongPrimesConditions(RSAParameters para) { BigInteger p = transform(para.P); BigInteger q = transform(para.Q); BigInteger p1, p2, q1, q2; Parallel.Invoke( () => { p1 = findFactor(p - 1); }, () => { p2 = findFactor(p + 1); }, () => { q1 = findFactor(q - 1); }, () => { q2 = findFactor(q + 1); } ); if (p1 == 0 || p2 == 0 || q1 == 0 || q2 == 0) return false; byte[] bp1 = p1.ToByteArray(); byte[] bp2 = p2.ToByteArray(); byte[] bq1 = q1.ToByteArray(); byte[] bq2 = q2.ToByteArray(); if (bp1.Length < 13 || bp2.Length < 13 || bq1.Length < 13 || bq2.Length < 13) return false; if ((bp1.Length + bp2.Length) > 62 || (bq1.Length + bq2.Length) > 62) return false; return true; } KẾT LUẬN Khóa luận nêu lên được vấn đề bức thiết trong xã hội hiện nay là xây dựng hệ thống chứng thực số, tạo chữ ký số; có hệ thống các lý thuyết để giải quyết vấn đề. Khóa luận có chương trình xử lý song song khi sinh cặp số nguyên tố và kiểm tra tính nguyên tố mạnh của chúng đi kèm – một giai đoạn quan trọng, chủ chốt của hệ thống CA. Chương trình sinh khóa được xây dựng từ chương trình sinh hai số nguyên tố này sẽ đảm bảo mức độ an toàn của hệ thống CA trước sự tấn công của các hacker chuyên nghiệp. Với sự tìm hiểu không ngừng của giới thám mã (một cộng đồng có mục đích phát hiện lỗi của hệ mã RSA nhằm đóng góp xây dựng hệ mã ngày càng an toàn hơn), các lý thuyết về khóa mạnh đã được ra đời và chương trình này dựa trên những lý thuyết ấy để thực hiện. Một hệ thống CA an toàn sẽ mang lại nhiều ý nghĩa to lớn cho công cuộc số hóa của đất nước. Kết quả là khả quan, thể hiện đúng tinh thần của một khóa luận tốt nghiệp có tính thực tiễn, ứng dụng cao. Kết quả này có thể được sử dụng để phát triển cho tương lai như: xây dựng hệ thống CA hoàn chỉnh; xây dựng công cụ dùng để mã hóa, giải mã văn bản theo thuật toán của hệ mã RSA, tạo chữ ký số. TÀI LIỆU THAM KHẢO [1] Phạm Huy Điển – Hà Huy Khoái. Mã hóa thông tin cơ sở toán học và ứng dụng. Nhà xuất bản Đại học Quốc gia Hà Nội, 2004, trang 6-12, 31-32, 85-91. [2] Hà Huy Khoái – Phạm Huy Điển. Số học thuật toán. Nhà xuất bản Đại học Quốc gia Hà Nội, 2003, trang 21-23, 34-38. [3] [4] [5] [6] [7] [8] Microsoft. Taking Parallelism Mainstream Microsoft October 2009. trang 1-21. [9] NIST - U.S. National Institute of Standards and Technology. FIPS 186-3. Trang 50-51, 68-73. [10] [11] [12] AreStrongPrimesNeededForRSA.pdf [13]

Các file đính kèm theo tài liệu này:

  • docXử lý song song quá trình sinh khóa của hệ thống cấp phát chứng thực số.doc