Tải bản đầy đủ (.docx) (21 trang)

BÁO cáo CUỐI kỳ PHÁT TRIỂN CHỨC NĂNGMÃ hóa và GIẢI mã BẰNGHỢP NGỮ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.58 MB, 21 trang )

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

TIEU LUAN MOI download :


MỤC LỤC

TỔNG QUAN VỀ ĐỀ TÀI................................................................................ 1
PHẦN NỘI DUNG............................................................................................ 2
1. Thiết kế chương trình............................................................................. 2
2. Ý tưởng thiết kế chương trình................................................................ 3
2.1. Viết chương trình C

3

2.2. Ý tưởng viết hàm mã hóa encode trong chương trình
lbEncode.asm



3

2.3. Ý tưởng viết hàm giải mã decode trong chương trình
lbDecode.asm

3

3. Cách giải quyết chương trình (Viết chương trình).................................. 4
3.1. Khai báo hàm encode và decode

4

3.2. Tiến hành mã hóa

4

3.2.1. Lấy tập tin cần mã hóa

4

3.2.2. Tạo tập tin chứa kết quả mã hóa

6

3.2.3. Xử lí hàm giải mã

7

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 quả giải mã..................................... 13
3.3.3. Xử lí hàm giải mã........................................................... 13
4. Kết quả................................................................................................. 14
KẾT LUẬN...................................................................................................... 16

TIEU LUAN MOI download :


DANH MỤC HÌNH ẢNH

Hình 1 . u cầu đề tài............................................................................... 1
Hình 2 . Thiết kế chương trình................................................................... 2
Hình 3 . Khai báo encode và decode vào trong chương trình RunProject.c.4
Hình 4 . Code lấy tập tin cần mã hóa......................................................... 5
Hình 5 . Tạo tập tin chứa kết quả mã hóa................................................... 6
Hình 6 . Tiến hành khai báo key, push thanh ghi, tham số và tính số vịng
lặp.................................................................................................................................. 8
Hình 7 . Vịng lặp _while......................................................................... 10
Hình 8 . Điều kiện lặp của vịng lặp _while............................................. 11
Hình 9 . Code lấy tập tin cần giải mã....................................................... 12
Hình 10 . Tạo tập tin chứa kết quả 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

TIEU LUAN MOI download :



TỔNG QUAN VỀ ĐỀ TÀI

Lập trình chức năng mã hóa và giải mã bằng hợp ngữ, viết chương trình
C để mã hóa một tệp và sử dụng chức năng giải mã để kiểm tra chức năng mã
hóa. So sánh thời gian thực hiện chương trình
Trong hàm mã hóa, u cầu mã hóa bằng cách lấy 16 bit tức là 1 word
xoay sang phải một số a (a là giá trị của số bit cần xoay), sau đó thực hiện quay
trái xen kẻ quay phải. Cịn giải mã thì ngược lại, chúng ta bắt đầu quay trái
trước rồi mới quay phải.

Hình 1. Yêu cầu đề tài.

1

TIEU LUAN MOI download :


PHẦN NỘI DUNG

1. Thiết kế chương trình.
Thiết kế chương trình bắt đầu bằng việc tạo thư mục có tên FinalProject
để chứa các chương trình viết bằng hợp ngữ, C và những tập tin được tạo ra khi
chạy và biên dịch từ những những chương trình trên. Trong đó:
Tập tin MyFile.txt chứa chuỗi cần mã hóa.
Tập tin lbEncode.asm là một chương trình viết bằng hợp ngữ chứa
hàm encode dùng để mã hóa tập tin.
Tập tin lbDecode.asm là một chương trình viết bằng hợp ngữ chứa
hàm decode dùng để giải mã tập tin.
Tập tin RunProject.c là một chương trình viết bằng ngơn ngữ C dùng
để đọc một tập tin vào, sau đó chúng ta sẽ sử dụng hàm encode để mã hóa tập

tin và chứa kết quả mã hóa trong tập tin FileEncode.txt. Sau khi tập tin đã
được mã hóa ta dùng hàm decode giải mã tập tin FileEncode.txt, kết quả được
lưu trong tập tin FileDecode.txt.
Kiểm tra lại chức năng mã hóa của hàm encode bằng cách so sánh
kết quả của 2 tập tin MyFile.txt và FileDecode.txt.

Hình 2. Thiết kế chương trình.
2

TIEU LUAN MOI download :


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 và giải mã. Đọc
tập tin cần mã hóa vào trong chuỗi, truyền lần lượt chiều dài và giá trị chuỗi
vào trong hàm encode để mã hóa.
Sau khi mã hóa, tương tự truyền chiều dài và 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 trong chương trình lbEncode.asm.
Tạo một mảng KEY chứa giá trị của các số bit cần xoay, giá trị của các
số bit được chọn ngẫu nhiên, mảng KEY có chiều dài là 8.
Push 2 tham số là chiều dài chuỗi và địa chỉ chuỗi vào Stackframe.
Xử lí quay trái, quay phải:
Ta thực hiện quay trái trước, mỗi lần quay ta cần quay 2 byte kí tự với
số bit cần quay là KEY[a] (a là vị trí của phần tử trong mảng KEY).
Sau khi quay trái ta tăng giá trị của biến a và thực hiện quay phải với
số bit cần quay là KEY[a].
Mà mảng KEY chỉ chứa 8 phần tử nên số lần quay trái xen kẻ quay phải

chỉ có 4 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
trong vòng lặp. Nếu a = 8 ta thực hiện lại vòng lặp và gán giá trị của a bằng
0 (tức là KEY[a] chứa giá trị của phần tử đầu tiên trong mảng KEY).
2.3. Ý tưởng viết hàm giải mã decode trong chương trình lbDecode.asm.
Ý

tưởng viết hàm giải mã tương tự như viết hàm mã hóa những thay

vì quay trái trước rồi quay phải như trong hàm mã hóa thì trong hàm giải mã
ta làm ngược lại.
3

TIEU LUAN MOI download :


3. Cách giải quyết chương trình (Viết chương trình).
3.1. Khai báo hàm encode và decode.
Trong chương trình RunProject.c khai báo encode và decode trong
lbEncode.asm và lbDecode.asm bằng câu lệnh :
extern char*encode();
extern char*decode();

Hình 3. Khai báo encode và decode vào trong 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 một chiều kiểu kí tự
với 1024 ơ nhớ:
4


TIEU LUAN MOI download :


char str1[1024];
Mở tập tin có tên MyFile.txt để đọc dữ liệu. Khai báo một con trỏ
fp kiểu FILE trỏ đến tập tin đó:
FILE *fp = fopen("MyFile.txt","r");
Đọc tất cả các 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 và đóng file fp:
int len1 = strlen(str1);
fclose(fp);

Hình 4. Code lấy tập tin cần mã hóa.

5

TIEU LUAN MOI download :


3.2.2. Tạo tập tin chứa kết quả mã hóa.
Mở tập tin FileEncode.txt để ghi và đọc kết quả sau khi mã hóa. Khai
báo con trỏ fpEncode trỏ đến tập tin này.
FILE *fpEncode;
fpEncode = fopen("FileEncode.txt","w+");
Ghi kết quả sau khi đã xử lí qua hàm encode tới fpEncode và đóng
tập tin fpEncode:
fputs(encode(len1,str1),fpEncode);
fclose(fpEncode);


Hình 5. Tạo tập tin chứa kết quả mã hóa.

6

TIEU LUAN MOI download :


3.2.3. Xử lí hàm giải mã.
Hàm giải mã chứa trong chương trình lbEncode.asm

lặp.

Tiến hành push thanh ghi, tham số, khai báo key và tính số vịng

Khi gọi hàm encode : fputs(encode(len1,str1),fpEncode); hàm sẽ
bắt đầu thực thi như sau:
Đầu tiên, ta khai báo mảng key gồm 8 phần tử là 2,3,4,5,6,7,8,9. Và
tiến hành push 2 tham số là chiều dài chuỗi ( len1 ) và địa chỉ chuỗi ( str1 )
vào trong Stackframe.

Low mem

esp
ebp
return address
[ebp+8]

len1
[ebp+12]


str1

High mem
Stackframe

Đẩy chiều dài của chuỗi str1 vào thanh ghi ecx và lấy địa chỉ đầu
tiên của vùng nhớ chuỗi đẩy vào thanh ghi esi:
mov ecx, [ebp+8]
mov esi, [ebp+12]
Gán giá trị cho thanh ghi eax bằng 0 để vào duyệt từng giá trị trong key:
mov eax,0
Tính số vòng lặp _while bằng cách lấy chiều dài chuỗi chia cho 4, vì mỗi
lần quay trái, quay phải trong _while, ta tốn mất 2 key. Mà ta có 8 key vì
7


TIEU LUAN MOI download :


vậy vịng lặp chỉ lặp được 4 lần. Để tính được số vòng lặp _while , ta tiến
hành dịch trái thanh ghi ecx 2 bit:
shr

ecx,2

Hình 6. Tiến hành khai báo key, push thanh ghi, tham số và tính số vịng lặp.


Vòng lặp _while:
Đẩy giá trị của thanh ghi cl ( cl là thành ghi chứa bit vùng thấp của ecx)


vào thanh ghi bl (thanh ghi bl sẽ chứa giá trị ban đầu của thanh ghi cl):
mov bl,cl
Quay phải:
Lấy giá trị của key bắt đầu từ phần tử đầu tiên (eax = 0) đẩy vào thanh
ghi cl. Lúc này thanh ghi cl chứa số bit cần xoay. Sau đó tăng giá trị thanh ghi
eax lên 1, để lấy giá trị của phần tử tiếp theo trong mảng key:
8

TIEU LUAN MOI download :


mov cl,byte[key+eax]
inc

eax

Tiến hành quay phải 2 kí tự (tức là 1 word) của thanh ghi esi (esi chứa
vùng nhớ địa chỉ chuỗi) với số bit cần xoay là giá trị của thanh ghi cl. Sau đó
tăng giá trị thanh ghi esi lên 2 (tức là bỏ qua 2 kí tự vừa được quay):
ror

word[esi], cl

add

esi,2

Quay trái:
Lấy giá trị của key đẩy vào thanh ghi cl. Lúc này thanh ghi cl chứa số

bit cần xoay. Sau đó tăng giá trị thanh ghi eax lên 1, để lấy giá trị của phần tử
tiếp theo trong mảng key:
mov cl,byte[key+eax]
inc

eax

Tiến hành quay phải 2 kí tự (tức là 1 word) của thanh ghi esi (esi chứa
vùng nhớ địa chỉ chuỗi) với số bit cần xoay là giá trị của thanh ghi cl. Sau đó
tăng giá trị thanh ghi esi lên 2 (tức là bỏ qua 2 kí tự vừa được quay):
rol

word[esi], cl

add

esi,2

9

TIEU LUAN MOI download :


Hình 7. Vịng lặp _while.


Điều kiện lặp lại của vịng lặp _while.

Đẩy giá trị của thanh ghi bl vào thanh ghi cl (nghĩa là gán lại giá trị ban
đầu của thanh ghi cl ):

mov cl,bl
Ta bắt đầu so sánh thanh ghi eax (thanh ghi chứ giá trị index của mảng
key) với 8:
cmp eax,8
Nếu như eax không bằng 8 (tức là ta chưa duyệt hết các giá trị của
mảng key). Khi đó ta thực hiện nhãn _Unequal để quay lại vịng lặp và tiếp
tục quay trái, quay phải:
jne

_Unequal

_Unequal:
10

TIEU LUAN MOI download :


loop _while
Ta thực hiện lại vòng lặp _while cho đến khi giá trị của thanh ghi eax =
8 thì thực hiện nhãn _Equal. Trong hàm này ta thực hiện trừ giá trị thanh ghi
eax đi cho 8 (có nghĩa là giá trị thanh ghi eax lúc này bằng 0) và ta quay lại
thực hiện vòng lặp _while cho đến hết chuỗi sẽ kết thúc:
_Equal:
sub

eax,8

loop _while

Hình 8. Điều kiện lặp của vịng lặp _while.

Khi gặp lệnh return bộ vi xử lí sẽ pop ra những thanh ghi đã push vào để
sử dụng trong trong chương trình.

11

TIEU LUAN MOI download :


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 một 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 quả vừa được mã hóa)
để đọc dữ liệu. Tập tin được con trỏ fpEncode trỏ đến:
fpEncode = fopen("FileEncode.txt","r");
Đọc tất cả các kí tự từ tập tin mà fpEncode trỏ tới và 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 và đóng file fpEncode:
int len2 = strlen(str2);
fclose(fpEncode);

Hình 9. Code lấy tập tin cần giải mã.
12

TIEU LUAN MOI download :


3.3.2. Tạo tập tin chứa kết quả giải mã.
Mở tập tin FileDecode.txt để ghi kết quả sau khi giải mã. Khai báo con

trỏ fpDecode trỏ đến tập tin này:
FILE *fpDecode;
fpDecode = fopen("FileDecode.txt","w");
Ghi kết quả sau khi đã xử lí qua hàm decode tới fpDecode và đóng
tập tin fpDecode:
fputs(decode(len2,str2),fpDecode);
fclose(fpDecode);

Hình 10. Tạo tập tin chứa kết quả giải mã.
3.3.3. Xử lí hàm giải mã.
Hàm giải mã chứa trong chương trình lbDecode.asm
Hàm giải mã được xây dựng tương tự hàm mã hóa, những thay vì thực
hiện quay trái trước rồi quay phải như trong hàm mã hóa thì trong hàm giải
mã ta làm ngược lại (có nghĩa là ta quay phải rồi quay trái).

13

TIEU LUAN MOI download :


Hình 11. Hàm giải mã.
4. Kết quả.
Tập tin dùng để mã hóa MyFile.txt:

Hình 12. MyFile.txt
14

TIEU LUAN MOI download :



Tập tin đã được mã hóa FileEncode.txt:

Hình 13. FileEncode.txt
Tập tin đã được giải mã FileDecode.txt:

Hình 14. FileDecode.txt

15

TIEU LUAN MOI download :


KẾT LUẬN

Về cơ bản bài báo cáo đã hoàn thành khá đầy đủ mục tiêu đặt ra. Biên
dịch thành công hai chương trình được viết bằng hợp ngữ là lbEncode.asm và
lb lbDecode.asm. Sau đó, khai báo hai hàm encode và decode trong hai
chương trình này vào trong chương trình viết bằng ngôn ngữ C RunProject.c
để tiến hành giải mã và mã hóa.
Sau khi giải mã và mã hóa chương trình đã cho ra kết quả trong tập tin
đã giải mã FileDecode.asm giống với tập tin ban đầu được lấy để mã hóa là
MyFile.asm. Điều này cho thấy các chương trình đã chạy thành công và cho
ra kết quả đạt với yêu cầu mà đề tài đưa ra.
Tuy nhiên, còn vấn đề chưa được xử lí là chưa viết được chương trình
tính thời gian chạy của hai hàm encode và decode. Nên là chúng ta không
thể so sánh được tốc độ xử lí của hai hàm.
Nhưng nhìn chung bài báo cáo cũng đã hoàn thành được những mục
tiêu cơ bản mà đề tài đã yêu cầu.

16


TIEU LUAN MOI download :


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:
/>
17

TIEU LUAN MOI download :




×