0
Tải bản đầy đủ (.doc) (52 trang)

Giải pháp: Các công nghệ song song trong Visual Studio 2010 Microsoft

Một phần của tài liệu XỬ LÝ SONG SONG QUÁ TRÌNH SINH KHÓA CỦA HỆ THỐNG CẤP PHÁT CHỨNG THỰC SỐ (Trang 36 -36 )

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.

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 • 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<StockQuote> Query(vector<StockQuote> stocks) {

concurrent_vector<StockQuote> 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<StockQuote> Query(IEnumerable<StockQuote> 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<string, Task<double>>(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<AgentMessage>* MsgBuffer = new unbounded_buffer<AgentMessage>(); // 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 p,q - 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 p,q 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ư

n q p d

e, , , , .

 Chuyển 2 số p,q 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ố p,q kiểm tra các test.

 Kiểm tra số p theo: thuật toán Miller-Rabin xác suất lỗi 2100 và thuật toán Lucas.

 Kiểm tra số q theo: thuật toán Miller-Rabin xác suất lỗi 2−100 và thuật toán Lucas.

 Kiểm tra điều kiện ràng buộc giữa pq để 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 p,q: tìm các thừa số nguyên tố p1,p2,q1,q2 lần lượt của p−1,p+1,q−1,q+1và 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.

 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 p,q có bước tìm các thừa số nguyên tố p1,p2,q1,q2 lần lượt của p−1,p+1,q−1,q+1. 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à N cặp số p,q 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ố p−1,q−1 khó bị hacker phân tích ra các thừa số nguyên tố vụn khi p,q được dùng làm khóa.

 Chương trình thông báo số cặp p,q đã đượ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

Hình 4.1: Giao diện của chương trình

Trong đó:

N là số cặp p,q 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.

Hình 4.2: Số cặp p,q đã 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 p,q đã 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.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

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.

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<int> listK = new List<int>(); listK.Clear();

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<int>(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;

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ố p,q 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ố p,q 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ố.

[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] http://tailieu.vn/xem-tai-lieu/giai-phap-xac-thuc-so.176584.html [4] http://vi.wikipedia.org/wiki/Kh%C3%B3a_c%C3%B4ng_khai [5] http://soict.hut.vn/~vannk/.../BaiGIangMatMaKhoaCongKhai-NKVan.pdf [6] http://vi.wikipedia.org/wiki/Ch%E1%BB%AF_k%C3%BD_s%E1%BB%91 [7] http://vi.wikipedia.org/wiki/Ch%E1%BB%A9ng_th%E1%BB%B1c_kh %C3%B3a_c%C3%B4ng_khai

[8] Microsoft. Taking Parallelism Mainstream Microsoft October 2009. http://msdn.microsoft.com/en-us/concurrency/ee847335.aspx, trang 1-21.

[9] NIST - U.S. National Institute of Standards and Technology. FIPS 186-3. Trang 50-51, 68-73. [10] http://en.wikipedia.org/wiki/Strong_prime [11] http://www.ece.gmu.edu/courses/ECE543/project/reports_1999/dong_report.pdf [12] http://people.csail.mit.edu/.../RivestSilverman- AreStrongPrimesNeededForRSA.pdf [13] http://www.mediafire.com/?ljvmmhnd2kz

Một phần của tài liệu XỬ LÝ SONG SONG QUÁ TRÌNH SINH KHÓA CỦA HỆ THỐNG CẤP PHÁT CHỨNG THỰC SỐ (Trang 36 -36 )

×