Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
1,92 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP.HCM KHOA ĐÀO TẠO CHẤT LƯỢNG CAO BỘ MƠN KIẾN TRÚC MÁY TÍNH VÀ HỢP NGỮ BÁO CÁO CUỐI KỲ PHÁT TRIỂN CHỨC NĂNG MÃ HÓA VÀ GIẢI MÃ BẰNG HỢP NGỮ MÃ MÔN HỌC: 202CAAL230180 SV THỰC HIỆN: DƯƠNG HOÀNG THY TRÂN MSSV: 19110300 GIÁO VIÊN HƯỚNG DẪN: NGUYỄN ĐĂNG QUANG Tp Hồ Chí Minh, tháng…năm 2020 MỤC LỤC TỔNG QUAN VỀ ĐỀ TÀI PHẦN NỘI DUNG Thiết kế chương trình 2 Ý tưởng thiết kế chương trình 2.1 Viết chương trình C 2.2 Ý tưởng viết hàm mã hóa encode chương trình lbEncode.asm 2.3 Ý tưởng viết hàm giải mã decode chương trình lbDecode.asm 3 Cách giải chương trình (Viết chương trình) 3.1 Khai báo hàm encode decode 3.2 Tiến hành mã hóa 3.2.1 Lấy tập tin cần mã hóa 3.2.2 Tạo tập tin chứa kết mã hóa .6 3.2.3 Xử lí hàm giải mã 3.3 Tiến hành giải mã 12 3.3.1 Lấy tập tin cần giải mã 12 3.3.2 Tạo tập tin chứa kết giải mã 13 3.3.3 Xử lí hàm giải mã 13 Kết 14 KẾT LUẬN 16 DANH MỤC HÌNH ẢNH Hình Yêu cầu đề tài Hình Thiết kế chương trình Hình Khai báo encode decode vào chương trình RunProject.c.4 Hình Code lấy tập tin cần mã hóa Hình Tạo tập tin chứa kết mã hóa Hình Tiến hành khai báo key, push ghi, tham số tính số vòng lặp Hình Vòng lặp _while 10 Hình Điều kiện lặp vòng lặp _while 11 Hình Code lấy tập tin cần giải mã 12 Hình 10 Tạo tập tin chứa kết giải mã 13 Hình 11 Hàm giải mã 14 Hình 12 MyFile.txt 14 Hình 13 FileEncode.txt 15 Hình 14 FileDecode.txt 15 TỔNG QUAN VỀ ĐỀ TÀI Lập trình chức mã hóa giải mã hợp ngữ, viết chương trình C để mã hóa tệp sử dụng chức giải mã để kiểm tra chức mã hóa So sánh thời gian thực chương trình Trong hàm mã hóa, u cầu mã hóa cách lấy 16 bit tức word xoay sang phải số a (a giá trị số bit cần xoay), sau thực quay trái xen kẻ quay phải Cịn giải mã ngược lại, bắt đầu quay trái trước quay phải Hình Yêu cầu đề tài PHẦN NỘI DUNG Thiết kế chương trình Thiết kế chương trình bắt đầu việc tạo thư mục có tên FinalProject để chứa chương trình viết hợp ngữ, C tập tin tạo chạy biên dịch từ những chương trình Trong đó: Tập tin MyFile.txt chứa chuỗi cần mã hóa Tập tin lbEncode.asm chương trình viết hợp ngữ chứa hàm encode dùng để mã hóa tập tin Tập tin lbDecode.asm chương trình viết hợp ngữ chứa hàm decode dùng để giải mã tập tin Tập tin RunProject.c chương trình viết ngơn ngữ C dùng để đọc tập tin vào, sau sử dụng hàm encode để mã hóa tập tin chứa kết mã hóa tập tin FileEncode.txt Sau tập tin mã hóa ta dùng hàm decode giải mã tập tin FileEncode.txt, kết lưu tập tin FileDecode.txt Kiểm tra lại chức mã hóa hàm encode cách so sánh kết tập tin MyFile.txt FileDecode.txt Hình Thiết kế chương trình 2 Ý tưởng thiết kế chương trình 2.1 Viết chương trình C Trong C khai báo extern cho hai hàm dùng để mã hóa giải mã Đọc tập tin cần mã hóa vào chuỗi, truyền chiều dài giá trị chuỗi vào hàm encode để mã hóa Sau mã hóa, tương tự truyền chiều dài giá trị chuỗi mã hóa vào hàm decode để giải mã 2.2 Ý tưởng viết hàm mã hóa encode chương trình lbEncode.asm Tạo mảng KEY chứa giá trị số bit cần xoay, giá trị số bit chọn ngẫu nhiên, mảng KEY có chiều dài Push tham số chiều dài chuỗi địa chuỗi vào Stackframe Xử lí quay trái, quay phải: Ta thực quay trái trước, lần quay ta cần quay byte kí tự với số bit cần quay KEY[a] (a vị trí phần tử mảng KEY) Sau quay trái ta tăng giá trị biến a thực quay phải với số bit cần quay KEY[a] Mà mảng KEY chứa phần tử nên số lần quay trái xen kẻ quay phải có lần Vì vậy, để tăng số vịng lặp ta cần: để lệnh quay trái, quay phải vào vòng lặp Nếu a = ta thực lại vòng lặp gán giá trị a (tức KEY[a] chứa giá trị phần tử mảng KEY) 2.3 Ý tưởng viết hàm giải mã decode chương trình lbDecode.asm Ý tưởng viết hàm giải mã tương tự viết hàm mã hóa thay quay trái trước quay phải hàm mã hóa hàm giải mã ta làm ngược lại 3 Cách giải chương trình (Viết chương trình) 3.1 Khai báo hàm encode decode Trong chương trình RunProject.c khai báo encode decode lbEncode.asm lbDecode.asm câu lệnh : extern char*encode(); extern char*decode(); Hình Khai báo encode decode vào chương trình RunProject.c 3.2 Tiến hành mã hóa 3.2.1 Lấy tập tin cần mã hóa Trong chương trình RunProject.c, khai báo mảng chiều kiểu kí tự với 1024 nhớ: char str1[1024]; Mở tập tin có tên MyFile.txt để đọc liệu Khai báo trỏ fp kiểu FILE trỏ đến tập tin đó: FILE *fp = fopen("MyFile.txt","r"); Đọc tất kí từ từ tập tin mà fp trỏ tới ghi vào chuỗi str1: fscanf(fp, "%[^EOF]",str1); Khai báo biến len1 chứa chiều dài chuỗi str1 đóng file fp: int len1 = strlen(str1); fclose(fp); Hình Code lấy tập tin cần mã hóa 3.2.2 Tạo tập tin chứa kết mã hóa Mở tập tin FileEncode.txt để ghi đọc kết sau mã hóa Khai báo trỏ fpEncode trỏ đến tập tin FILE *fpEncode; fpEncode = fopen("FileEncode.txt","w+"); Ghi kết sau xử lí qua hàm encode tới fpEncode đóng tập tin fpEncode: fputs(encode(len1,str1),fpEncode); fclose(fpEncode); Hình Tạo tập tin chứa kết mã hóa 3.2.3 Xử lí hàm giải mã Hàm giải mã chứa chương trình lbEncode.asm Tiến hành push ghi, tham số, khai báo key tính số vịng lặp Khi gọi hàm encode : fputs(encode(len1,str1),fpEncode); hàm bắt đầu thực thi sau: Đầu tiên, ta khai báo mảng key gồm phần tử 2,3,4,5,6,7,8,9 Và tiến hành push tham số chiều dài chuỗi ( len1 ) địa chuỗi ( str1 ) vào Stackframe Low mem esp ebp return address [ebp+8] len1 [ebp+12] str1 High mem Stackframe Đẩy chiều dài chuỗi str1 vào ghi ecx lấy địa vùng nhớ chuỗi đẩy vào ghi esi: mov ecx, [ebp+8] mov esi, [ebp+12] Gán giá trị cho ghi eax để vào duyệt giá trị key: mov eax,0 Tính số vòng lặp _while cách lấy chiều dài chuỗi chia cho 4, lần quay trái, quay phải _while, ta tốn key Mà ta có key vịng lặp lặp lần Để tính số vịng lặp _while , ta tiến hành dịch trái ghi ecx bit: shr ecx,2 Hình Tiến hành khai báo key, push ghi, tham số tính số vịng lặp Vịng lặp _while: Đẩy giá trị ghi cl ( cl thành ghi chứa bit vùng thấp ecx) vào ghi bl (thanh ghi bl chứa giá trị ban đầu ghi cl): mov bl,cl Quay phải: Lấy giá trị key phần tử (eax = 0) đẩy vào ghi cl Lúc ghi cl chứa số bit cần xoay Sau tăng giá trị ghi eax lên 1, để lấy giá trị phần tử mảng key: mov cl,byte[key+eax] inc eax Tiến hành quay phải kí tự (tức word) ghi esi (esi chứa vùng nhớ địa chuỗi) với số bit cần xoay giá trị ghi cl Sau tăng giá trị ghi esi lên (tức bỏ qua kí tự vừa quay): ror word[esi], cl add esi,2 Quay trái: Lấy giá trị key đẩy vào ghi cl Lúc ghi cl chứa số bit cần xoay Sau tăng giá trị ghi eax lên 1, để lấy giá trị phần tử mảng key: mov cl,byte[key+eax] inc eax Tiến hành quay phải kí tự (tức word) ghi esi (esi chứa vùng nhớ địa chuỗi) với số bit cần xoay giá trị ghi cl Sau tăng giá trị ghi esi lên (tức bỏ qua kí tự vừa quay): rol word[esi], cl add esi,2 Hình Vịng lặp _while Điều kiện lặp lại vòng lặp _while Đẩy giá trị ghi bl vào ghi cl (nghĩa gán lại giá trị ban đầu ghi cl ): mov cl,bl Ta bắt đầu so sánh ghi eax (thanh ghi giá trị index mảng key) với 8: cmp eax,8 Nếu eax không (tức ta chưa duyệt hết giá trị mảng key) Khi ta thực nhãn _Unequal để quay lại vòng lặp tiếp tục quay trái, quay phải: jne _Unequal _Unequal: 10 loop _while Ta thực lại vòng lặp _while giá trị ghi eax = thực nhãn _Equal Trong hàm ta thực trừ giá trị ghi eax cho (có nghĩa giá trị ghi eax lúc 0) ta quay lại thực vòng lặp _while hết chuỗi kết thúc: _Equal: sub eax,8 loop _while Hình Điều kiện lặp vịng lặp _while Khi gặp lệnh return vi xử lí pop ghi push vào để sử dụng trong chương trình 11 3.3 Tiến hành giải mã 3.3.1 Lấy tập tin cần giải mã Trong chương trình RunProject.c, khai báo mảng chiều kiểu kí tự với 1024 ô nhớ: char str2[1024]; Mở tập tin có tên FileEncode.txt (tập tin chứa kết vừa mã hóa) để đọc liệu Tập tin trỏ fpEncode trỏ đến: fpEncode = fopen("FileEncode.txt","r"); Đọc tất kí tự từ tập tin mà fpEncode trỏ tới ghi vào chuỗi str2: fscanf(fpEncode, "%[^EOF]",str2); Khai báo biến len2 chứa chiều dài chuỗi str2 đóng file fpEncode: int len2 = strlen(str2); fclose(fpEncode); Hình Code lấy tập tin cần giải mã 12 3.3.2 Tạo tập tin chứa kết giải mã Mở tập tin FileDecode.txt để ghi kết sau giải mã Khai báo trỏ fpDecode trỏ đến tập tin này: FILE *fpDecode; fpDecode = fopen("FileDecode.txt","w"); Ghi kết sau xử lí qua hàm decode tới fpDecode đóng tập tin fpDecode: fputs(decode(len2,str2),fpDecode); fclose(fpDecode); Hình 10 Tạo tập tin chứa kết giải mã 3.3.3 Xử lí hàm giải mã Hàm giải mã chứa chương trình lbDecode.asm Hàm giải mã xây dựng tương tự hàm mã hóa, thay thực quay trái trước quay phải hàm mã hóa hàm giải mã ta làm ngược lại (có nghĩa ta quay phải quay trái) 13 Hình 11 Hàm giải mã Kết Tập tin dùng để mã hóa MyFile.txt: Hình 12 MyFile.txt 14 Tập tin mã hóa FileEncode.txt: Hình 13 FileEncode.txt Tập tin giải mã FileDecode.txt: Hình 14 FileDecode.txt 15 KẾT LUẬN Về báo cáo hoàn thành đầy đủ mục tiêu đặt Biên dịch thành công hai chương trình viết hợp ngữ lbEncode.asm lb lbDecode.asm Sau đó, khai báo hai hàm encode decode hai chương trình vào chương trình viết ngơn ngữ C RunProject.c để tiến hành giải mã mã hóa Sau giải mã mã hóa chương trình cho kết tập tin giải mã FileDecode.asm giống với tập tin ban đầu lấy để mã hóa MyFile.asm Điều cho thấy chương trình chạy thành cơng cho kết đạt với yêu cầu mà đề tài đưa Tuy nhiên, vấn đề chưa xử lí chưa viết chương trình tính thời gian chạy hai hàm encode decode Nên so sánh tốc độ xử lí hai hàm Nhưng nhìn chung báo cáo hoàn thành mục tiêu mà đề tài yêu cầu 16 TÀI LIỆU THAM KHẢO [1] Nguyễn Đăng Quang, Computer Architecture and Assembly language, 2017 [2] William Stallings, Computer Organization and Architecture, 9th Edition, Pearson Education, Prentice-Hall, 2013 [3] Ed jorgensen, x86-64 Assembly Language Programming with Ubuntu [4] Duy Thiên, asm-encoding- decoding Truy cập ngày 25/05/2021, đường dẫn: https://github.com/duythien0912/asm-encoding-decoding 17