Thực hiện giải thuật trên nhiều GPU

Một phần của tài liệu Nghiên cứu một số thuật toán thám mã sử dụng công nghệ tính toán song song trên các bộ xử lý đồ họa (Trang 77)

Duyệt qua tất cả các GPU.

Duyệt qua các khóa có độ dài từ 1 tới giá trị tối đa mà chúng ta đƣa ra Thực hiện phân chia các chuỗi khóa sinh ra cho các GPU

Với mỗi GPU

Lấy độ dài khóa hiện tại đƣa vào plan

77 Sinh các xâu ứng khóa với độ dài tƣơng ứng Tìm xem đã có khóa phù hợp chƣa sử dụng GPU

Có thì đƣa ra phƣơng án Chƣa có thì báo không tìm ra

Có lỗi trong quá trình chạy thì thông báo lỗi

Hàm với 1 GPU: solverThread

Hàm xử lý với từng GPU

Hàm kernel: GetHashes

Biến đổi xâu khóa thành mã MD5 và so sánh xem nó có phải là khóa cần tìm không. Biến đổi 1 xâu khóa thành mã MD5

Kiểm tra xem đó có phải khóa cần tìm không.

Hàm chạy song song nhiều GPU: crack

Duyệt qua tất cả các GPU với từng GPU thực hiện hàm solverThread với từng GPU đó Chi tiết hàm: plan: dạng struct typedef struct { int device; int ret; int *d_ret;

unsigned char *base; unsigned char *d_base; unsigned char *d_charset; int i;

} TGPUplan;

Trong đó:

device: là id của device

ret: chứa giá trị threadid trả về có khả năng cho kết quả đúng.

78 d_charset: lƣu các xâu đƣợc sinh ra

i: độ dài xâu tƣơng ứng đang xét

class MyBignum dùng để xử lý số lớn khi mà số lƣợng xâu khóa sinh ra là quá lớn.

Hàm xử lý cho từng GPU:

static CUT_THREADPROC solverThread(TGPUplan *plan) {

//Khởi tạo các tham số cần thiết Khởi tạo bộ đếm thời gian timer;

Khởi tạo mảng d_base để xác định việc phân chia cho các GPU; Khởi tạo mảng d_charset để lưu các xâu khóa trên GPU;

Khởi tạo mảng d_ret để lưu khóa có khả năng là trường hợp cần tìm kiếm; //Sử dụng bộ nhớ texture để tăng tốc độ xử lý

Copy các mảng base, charset vào d_base, d_charset trong GPU; for (int i = start; i <=stop ; ++i)

//start: độ dài xâu ngắn nhất, stop: độ dài xâu dài nhất {

plan->i=i;

Tính số khóa ứng với độ dài i;// Khởi tạo các mảng base cho các GPU; (adsbygoogle = window.adsbygoogle || []).push({});

Xác định những xâu nào nằm trên GPU đang xử lý;

//Thực hiện so sánh và tìm khóa với từng xâu trên GPU hiện đang xử lý; do

{

Thực hiện hàm kernel để tìm khóa; Không tìm thấy

Có lỗi thì thông báo lỗi;

Không có lỗi đưa ra thông báo không tìm thấy; Tìm thấy

Thông báo tìm thấy và xâu khóa cần tìm cùng thời gian chạy; }

while((bn_counter < bn_full)&&(!found)) ;//dừng khi duyệt tất cả các xâu hoặc tìm thấy xâu khóa cần tìm kiếm

} }

79

CHƯƠNG 7 - THỬ NGHIỆM VÀ ĐÁNH GIÁ

7.1.Thiết lập môi trường thử nghiệm

Để có thể chạy đƣợc các chƣơng trình CUDA, chúng ta cần có một môi trƣờng phù hợp, hỗ trợ cho CUDA cả về phần cứng và môi trƣờng phần mềm.

Môi trường phần cứng

Vì các ứng dụng CUDA đƣợc viết để chạy trên các GPU của Nvidia, nên điều kiện đầu tiên là phải có một GPU mà tính năng CUDA trên đó đƣợc thiết lập sẵn. Nhiều sản phẩm NVIDIA hiện nay cho phép CUDA. Bao gồm:

 Các GPU NVIDIA GeForce® 8, 9, và dòng 200

 Các dòng NVIDIA Tesla™ cho các giải pháp tính toán hiệu năng cao

 Dòng sản phẩm NVIDIA Quadro®

Một danh sách cập nhật các GPU hỗ trợ CUDA có thể tham khảo tại địa chỉ:

http://www.nvidia.com/object/cuda_learn_products.html.

Các thành phần phần cứng còn lại tùy thuộc vào khả năng tài chính nhƣng cấu hình tối thiểu để chạy các ứng dụng CUDA có thể tham khảo nhƣ sau:

- 1.6 GHz Intel or AMD dual core CPU

- NVIDIA GeForce 8 series or later CUDA enabled GPU

- Windows XP/Vista 32-bit or 64-bit

- Linux 32 or 64-bit - Mac OS

Trong khuôn khổ luận văn, các giải thuật đã đƣợc cài đặt thử nghiệm tại Trung tâm Tính toán hiệu năng cao – Đại học Bách Khoa Hà Nội. Môi trƣờng thử nghiệm là hệ thống GPUCluster gồm hai máy:

Máy 1:

Bộ xử lý Intel Core 2 Quad Q8400 2.66 Ghz (4 core) 8GB RAM

80

Một card đồ hoạ kép NVIDIA GeForce GTX 295 (tổng cộng 2 GPU) Một card đồ họa NVIDIA Tesla C1060 (adsbygoogle = window.adsbygoogle || []).push({});

Hệ điều hành Centos OS 5.3

Máy 2:

Bộ xử lý Intel Core 2 Quad Q8400 2.66 Ghz (4 core) 8GB RAM

Hai card đồ hoạ kép NVIDIA GeForce GTX 295 (tổng cộng 4 GPU) Hệ điều hành Centos OS 5.3

Bộ công cụ phát triển phần mềm

Bộ công cụ phát triển CUDA của NVIDIA gồm có 3 thành phần: 1 - Driver CUDA mới nhất.

2 - Một bộ Toolkit CUDA bao gồm:

- nvcc C compiler

- CUDA FFT and BLAS libraries for the GPU

- Profiler

- gdb debugger for the GPU

- CUDA runtime driver (also available in the standard NVIDIA GPU driver)

- CUDA programming manual

3 - Bộ ví dụ mẫu GPU_Computing_SDK

Bộ công cụ này có thể Download tại: http://www.nvidia.com/object/cuda_get.html

Quy trình cài đặt

Sau khi đã đáp ứng đủ yêu cầu về phần cứng, và hệ điều hành. Chúng ta có thể tiến hành cài đặt bộ phát triển công cụ CUDA theo thứ tự nhƣ sau:

81 1. CUDA Driver

2. CUDA Toolkit

3. CUDA SDK Code Samples

Chú ý rằng quá trình cài đặt CUDA Driver và CUDA Toolkit phải đƣợc thực hiện trƣớc khi chạy biên dịch các đoạn mã nguồn.

7.2.Thử nghiệm và đánh giá bài toán thám mã tệp nén Zip

7.2.1.Thử nghiệm

Toàn bộ 2 pha của bài toán khôi phục mật khẩu tệp nén Zip bao gồm giải thuật sinh xâu và kiểm tra mật khẩu ứng cử cho pha 1, và giải thuật xác định mật khẩu đúng cho pha 2 đã đƣợc xây dựng và triển khai thử nghiệm tại Trung tâm Tính toán Hiệu năng cao trƣờng Đại học Bách khoa Hà Nội.

Luận văn đã tiến hành thử nghiệm theo hai cách tiếp cận hình thành không gian mật khẩu phƣơng pháp vét cạn và phân tích cấu trúc mật khẩu.

Hiệu năng của bài toán đƣợc đánh giá theo 2 khía cạnh:

- Số lƣợng các khóa AES đƣợc sinh ra (chính là số lƣợng các mật khẩu ứng cử đƣợc sinh ra).

- Tốc độ khôi phục mật khẩu ban đầu của tệp nén ZIP đƣợc mã hóa (chính là toàn bộ bài toán, sau khi đã ghép pha thứ 2 của bài toán vào).

7.2.1.1.Tiếp cận vét cạn

Đầu vào là tập ký tự chữ cái hoa, chữ cái thƣờng và các chữ số S = {a − z, A − Z, 0 − 9} và số tiến trình chạy song song (hay số mật khẩu kiểm tra cùng lúc) là p = 32768. Các giải thuật song song đƣợc cài đặt trên môi trƣờng phần cứng nhƣ trên cho thấy tốc độ sinh khóa và kiểm tra khóa tăng rõ rệt so với việc thực hiện trên một tiến trình CPU. Bảng 7.1 minh hoạ hiệu năng thực hiện công việc xác định tập mật khẩu ứng cử trên CPU và GPU. (adsbygoogle = window.adsbygoogle || []).push({});

Độ dài mật khẩu Số lƣợng mật khẩu CPU 1GPU 2GPU 4GPU

1 62 4s 22s 22s 22s

2 3906 8m 45s 45s 45s

3 242234 2.25h 3m 1m30s 1m31s 4 15018570 5.25d 2h55m 1h28m 45m

82

Bảng 7.2 cho thấy số lƣợng khóa AES sinh ra trong một giây của GPU

Số lƣợng CPU/GPU Số lƣợng khóa sinh ra trong 1s

1GPU 1,536 khóa/1s

2GPU 3,072 khóa/1s

4GPU 6,144 khóa/1s

Bảng 7.2. Tốc độ sinh khóa trên GPU

Kết hợp thêm pha 2 và thực hiện trên GPU, ta có bảng thời gian khôi phục mật khẩu cho bài toán đặt ra nhƣ sau

Độ dài mật khẩu Số lƣợng mật khẩu 1GPU 2GPU 4GPU

1 62 23s 23s 23s

2 3906 47s 47s 47s

3 242234 4m55s 2m30s 1m34s

4 15018570 3h5m 1h 32m 45m48s

Bảng 7.3. Thời gian khôi phục mật khẩu trên GPU theo tiếp cận 1

Thời gian ở bảng trên đƣợc đo với giả thiết, tất cả mật khẩu ứng cử đều đƣợc giải mã, giải nén và nhận dạng bản rõ. Nhƣ vậy nếu xét trung bình, thời gian để khôi phục một mật khẩu sẽ chỉ bằng một nửa thời gian ở trên.

7.2.1.2.Tiếp cận phân tích cấu trúc mật khẩu

Đầu vào cần có hai loại từ điển: Một là loại từ điển chuyên dụng, gồm các mật khẩu thực để thống kê xác suất xuất hiện của các cấu trúc mật khẩu và của các kí tự chữ số và kí tự đặc biệt. Tuy nhiên, việc có đƣợc các mật khẩu thực nhƣ vậy là điều không dễ dàng bởi các lý do về an toàn an ninh. Do vậy trong thử nghiệm này, luận văn đã tạo ra một số cấu trúc dạng base cùng với xác suất của các kí tự chữ số, đặc biệt và của chính cấu trúc dạng base, để từ đó sinh ra cấu trúc dạng pre_terminal theo thứ tự xác suất giảm dần. Dạng từ điển thứ hai là từ điển gồm các từ có nghĩa, nhóm sử dụng từ điển dic-0294.txt chứa 869229 từ. Đây đƣợc coi là cuốn từ điển có số từ lớn nhất hiện nay. Với cách thức tự đề xuất các luật nhƣ vậy, nó sẽ không ảnh hƣởng tới hiệu năng khi đánh giá tổng quát chƣơng trình bởi (*)

và việc sinh ra các cấu trúc pre-terminal là độc lập nhau.

Bảng 7.4 so sánh các kết quả thu đƣợc của hai tiếp cận sinh không gian mật khẩu. Giả sử mật khẩu đúng là 6class$$4, có độ dài 9, nếu dung phƣơng pháp vét cạn thì phải duyệt 13,76.1015 ( ~ 621+ 622 + … + 629) khóa mới có hy vọng tìm đƣợc mật khẩu đúng, rõ ràng điều này không thực tế. Nhƣng tiếp cận 2 có thể giải quyết đƣợc với cấu trúc mật

83

khẩu 6L5$$4, cấu trúc này có thứ tự xác suất thứ 6, dùng từ điển dic-0294.txt, để sinh ra mật khẩu 6class$$4 và tổng số khóa phải duyệt là 469,332 khóa.

Số lƣợng GPU/CPU Số khóa(1) Thời gian(2)

CPU/GPU (TC1) 13,76.1015 khóa Không tìm ra mật khẩu trong thời gian cho phép

1GPU/TC2 469,332 khóa 5m 22s

2GPU/TC2 469,332 khóa 2m 57s

4GPU/TC2 469,332 khóa 1m 32s (adsbygoogle = window.adsbygoogle || []).push({});

Bảng 7.4. Bảng tốc độ sinh và duyệt khóa so sánh 2 cách tiếp cận

Khi bổ sung thêm công đoạn xác định mật khẩu đúng có thể làm bài toán dừng ngay lập tức mà không cần phải duyệt phần còn lại của không gian mật khẩu, bảng sau so sánh thời gian khôi phục mật khẩu giữa hai mật khẩu có xác suất xuất hiện cao (cấu trúc pre- terminal có thứ tự 6) và xác suất xuất hiện thấp hơn (cấu trúc pre-terminal có thứ tự 20).

Số CPU/GPU Số khóa(1) Thời gian(2) Số khóa(3) Thời gian(4)

CPU 469,332 1h 28m 1,482,632 4h 21m

1GPU 469,332 5m 22s 1,482,632 27m 42s

2GPU 469,332 2m 57s 1,482,632 14m 3s

4GPU 469,332 1m 32s 1,482,632 7m 10s

Bảng 7.5. Thời gian khôi phục mật khẩu trên GPU theo tiếp cận 2

7.2.2.Đánh giá

Kết quả này cho thấy hiệu năng kiểm tra mật khẩu ứng cử tăng đáng kể (xấp xỉ 48 lần cho 1 GPU và 170 lần cho hệ thống 4 GPU) khi thực hiện trên GPU. Giá trị 48 đến 170 lần là so sánh trên tổng thời gian tìm ra đƣợc toàn bộ mật khẩu ứng cử. Mặc dù chƣa thử

1 Số lƣợng khóa phải duyệt cho đến cấu trúc có thứ tự 6 2

Thời gian tƣơng ứng để duyệt số khóa (mật khẩu) cho đến cấu trúc có thứ tự 6 3 Số lƣợng khóa phải duyệt cho đến cấu trúc thứ tự 20

84

nghiệm đƣợc với những không gian mật khẩu có độ dài lớn, những thử nghiệm cho thấy khả năng ứng dụng cao của GPU trong bài toán khôi phục mật khẩu tệp nén.

Ta cũng nhận thấy thời gian khôi phục mật khẩu của bài toán (thực hiện cả pha 1 và pha 2) so với thời gian sinh tập mật khẩu ứng cử (thực hiện pha 2) không chênh lệch nhau nhiều, do bởi hai lý do:

- Thứ nhất, chi phí tính toán tập trung chủ yếu ở pha 1 – nơi có hàm băm với độ phức tạp lớn, trong pha 2, việc thực hiện chiếm chi phí ít trên tổng chi phí bởi vì chỉ giải mã, giải nén trên một phần rất nhỏ của tệp tin ZIP.

- Thứ hai, mỗi lần kích hoạt kernel ta kiểm tra đƣợc p mật khẩu đồng thời (p = 32768). Số lƣợng mật khẩu ứng cử nếu có trong một lô nhƣ thế này cũng không nhiều vì theo lý thuyết sử dụng giá trị kiểm tra mật khẩu PVV sẽ giảm đƣợc không gian mật khẩu xuống 65536 lần.

7.3.Thử nghiệm và đánh giá bài toán thám mã MD5

7.3.1.Thử nghiệm

Giải thuật sinh và kiểm tra mật khẩu nhƣ đề cập ở trên đã đƣợc cài đặt thử nghiệm tại Trung tâm Tính toán hiệu năng cao – ĐHBKHN.

Kết quả là với đầu vào là tập ký tự chữ cái hoa, chữ cái thƣờng và các chữ số S = {a − z, A − Z, 0 − 9}, với số tiến trình trong một block threads = 128, số block blocks = 256 (16x16) . Các giải thuật song song đƣợc cài đặt trên môi trƣờng phần cứng nhƣ trên cho thấy tốc độ sinh và kiểm tra mật khẩu đạt đƣợc là 678,091,868 khóa /1s. Bảng 7.6 thể hiện tốc độ sinh khóa trên CPU và các GPU.

Số lƣợng CPU/GPU Số lƣợng khóa kiểm tra trong 1s

1 CPU 1.436.192 khóa/1s

1 GPU 194.379.500 khóa/1s

2 GPU 352.468.356 khóa/1s

4 GPU 678.091.868 khóa/1s

85 Độ dài mật

khẩu tối đa

Số lƣợng mật khẩu 1 GPU 2GPU 4GPU (adsbygoogle = window.adsbygoogle || []).push({});

1 62 0.33ms 0.28ms 0.25ms 2 3.906 0.65ms 0.58ms 0.44ms 3 242.234 2 ms 1.4ms 0.88ms 4 15.018.571 76 ms 47ms 22ms 5 931.151.403 5 s 2.9s 1.4 s 6 57.731.386.987 318s 194s 91 s 7 3.579.345.993.195 5h 7m 2h 49m 1h 28m 8 221.919.451.578.091 13d 5h 7d 7h 3d 19h

Bảng 7.7. minh hoạ hiệu năng thực hiện công việc thám mã MD5 trên CPU và GPU

Kết quả này cho thấy hiệu năng sinh và kiểm tra mật khẩu tăng đáng kể (xấp xỉ 135 lần cho 1 GPU và 472 lần cho hệ thống 4 GPU) khi thực hiện trên GPU.

Kết quả thử nghiệm cũng cho thấy khả năng ứng dụng cao của GPU trong bài toán thám mã MD5. Với hệ thống thử nghiệm hiện tại, bài toán thám mã MD5 khả thi với các mật khẩu có độ dài tối đa là 7, đƣợc xây dựng từ tập ký tự sinh có 62 ký tự.

7.3.2.Đánh giá

Với mục tiêu ban đầu đặt ra là khôi phục mật khẩu cho mã MD5, các kết quả nghiên cứu đã đạt đƣợc mục tiêu đó. Và các kết quả đã cho thấy tốc độ thực hiện bằng giải thuật song song cho hiệu năng lớn hơn đáng kể (135 lần cho hệ thống 1 GPU và 472 lần cho hệ thống 4 GPU) so với giải thuật tuần tự trên 1 CPU.

86

CHƯƠNG 8 - KẾT LUẬN VÀ HƯỚNG PHÁT

TRIỂN

8.1.Kết luận

Mục tiêu ban đầu đặt ra của luận văn là bài toán khôi phục mật khẩu cho tệp nén Zip và giải quyết bài toán thám mã MD5. Luận văn đã trình bày đƣợc các kết quả tìm hiểu, nghiên cứu và ứng dụng công nghệ GPU để giải quyết các bài toán thám mã cụ thể. Đối với bài toán khôi phục mật khẩu tệp nén Zip, các kết quả nghiên cứu về cơ bản đã hoàn thành đƣợc hai pha của bài toán. Đặc biệt với cách tiếp cận phân tích cấu trúc mật khẩu để hình thành không gian mật khẩu nhỏ hơn, không phụ thuộc vào độ dài mật khẩu và bao gồm các mật khẩu có chất lƣợng hơn nhiều lần so với các tiếp cận vét cạn. Công đoạn xác đinh mật khẩu đúng về cơ bản đã hoàn thành cho phép xác định mật khẩu đúng và chƣơng trình không phải duyệt phần không gian mật khẩu còn lại. Nếu mật khẩu đúng rơi vào vùng có xác suất xuất hiện cao thì thời gian khôi phục mật khẩu cho bài toán là chấp nhận đƣợc. Các kết quả đã cho thấy tốc độ thực hiện bằng giải thuật song song cho hiệu năng lớn hơn đáng kể (48 lần cho hệ thống 1GPU và 170 lần cho hệ thống 4GPU) so với giải thuật tuần tự trên 1 CPU.

Đối với bài toán thám mã MD5, các kết quả nghiên cứu và triển khai đã giải quyết đƣợc bài toán dựa trên hệ thống máy tính đa lõi. Các kết quả đã cho thấy tốc độ thực hiện bằng giải thuật song song cho tốc độ kiểm tra mã MD5 là 6.587.882 khóa/1s so với 1.642.676 khóa/1s của giải thuật tuần tự trên 1 CPU, nhanh gấp 4 lần.

Một phần của tài liệu Nghiên cứu một số thuật toán thám mã sử dụng công nghệ tính toán song song trên các bộ xử lý đồ họa (Trang 77)