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

Phúc triển chiến CNTT3k21 bài tập lớn lập trình mã hóa giải mã

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 (318.6 KB, 15 trang )

TRƯỜNG ĐẠI HỌC HẢI PHỊNG
KHOA CƠNG NGHỆ THƠNG TIN

BÀI TẬP LỚN

Đề Tài :
Lập Trình Mã hóa và giải mã bằng Python
Giáo viên hướng dẫn

: GS. Lê Đắc Nhường

Nhóm sinh viên thực hiện

: Phúc,Triển,Chiến

Lớp

: ĐHCNTT3

Khóa

: K21(2020 - 2024)

HẢI PHỊNG, năm 2022


Mục lục

Chương 1 Mã hóa là gì?
1.Mã hóa là gì?
Trong ngành mật mã học, mã hóa là q trình dùng để biến thông tin từ dạng này


sang dạng khác và ngăn những người không phận sự tiếp cận vào thông tin đó. Bản
thân việc mã hóa khơng ngăn chặn việc thơng tin bị đánh cắp, có điều thơng tin đó
lấy về cũng không xài được, không đọc được hay hiểu được vì đã được làm biến
dạng đi rồi.
Ví dụ: bạn có thư tỏ tình muốn gửi cho cơ đồng nghiệp ngồi ở phịng bên, nhưng
ngặt cái phịng bên có rất nhiều người có thể nhìn thấy bức thư đó trước cả cơ gái
bạn thích. Ngay cả khi bạn đã giao thư tận tay cho cơ ấy rồi thì vẫn có khả năng
những người kia sẽ bới móc lại bức thư ra mà đọc. Vì thế để việc tỏ tình diễn ra an
tồn và bí mật, bạn mã hóa bức thư tỏ tình theo cách mà chỉ bạn và cơ gái kia hiểu,
những người khác nhìn vào chỉ thấy một đống kí tự loằng ngoằng, rối rắm.


Mã hóa sẽ mang lại tính an tồn cao hơn cho thông tin, đặc biệt là trong thời đại
Internet ngày nay, khi mà thông tin phải đi qua nhiều trạm trung chuyển trước khi
đến được đích. Nếu khơng có mã hóa, khả năng thơng tin của bạn sẽ bị ai đó xem
trộm trong q trình truyền tải, rồi lợi dụng để làm việc xấu là hoàn toàn hiện hữu.
Thử nghĩ đến việc bạn đang gửi tài liệu mật cho đồng nghiệp ở một thành phố
khác, nếu khơng mã hóa tài liệu đó thì đối thủ cạnh tranh có thể sẽ thấy được kế
hoạch kinh doanh bí mật của cơng ty bạn và làm bạn mất đi doanh thu, thị trường.
Về lý thuyết, bất kì thơng điệp mã hóa nào cũng có thể bị giải mã mà khơng cần
biết về thuật tốn hoặc các khóa mã hóa (sẽ nói thêm ở bên dưới), vấn đề là mất
bao lâu và nguồn lực tính tốn cần thiết là như thế nào.
Có những lúc, để giải mã một tài liệu phải cần đến cả một siêu máy tính chạy liên
tục 24 giờ mỗi ngày, 7 ngày mỗi tuần, 365 ngày một năm. Khi đó thì thơng tin giải
mã ra khơng cịn giá trị nữa nên không đáng để bỏ công sức, nguồn lực vào chuyện
đó. Cịn nếu đã biết về thuật tốn hoặc khóa mã hóa thì người nhận có thể nhanh
chóng giải mã trong tích tắc và khơng gặp bất kì trở ngại nào.

2. Các loại mã hóa dữ liệu thơng dụng
Hiện có 4 biện pháp mã hố dữ liệu thơng dụng:



2.1Mã hóa cổ điển
Mã hóa cổ điển là cách đơn giản nhất, tồn lại lâu nhất trên thế giới và khơng cần
khóa bảo mật, chỉ cần người gửi và người nhận cùng biết về thuật tốn này là
được.
Ví dụ: nếu chúng ta dùng thuật tốn đổi kí tự trong câu văn thành kí tự liền kề
trong bảng chữ cái thì chữ “Tinh tế” sẽ biến thành “Ujoi uf”. Người nhận khi nhận
được chữ “Ujoi uf” thì chỉ việc dịch ngược lại là xong.

Tuy nhiên, giải pháp này được xem là khơng an tồn, vì nếu một người thứ ba biết
được thuật tốn thì xem như thơng tin khơng cịn bảo mật nữa. Việc giữ bí mật
thuật tốn trở nên rất quan trọng, và khơng phải ai cũng có thể giữ bí mật đó một
cách trọn vẹn. Có khả năng người đó sẽ rị rỉ ra, hoặc có ai đó ngồi giải ra thuật
tốn thì xem như chúng ta thua cuộc.

2.2 Mã hóa một chiều (hash)
Phương pháp này dùng để mã hóa những thứ khơng cần dịch lại ngun bản gốc.
Ví dụ, khi bạn đăng nhập vào Tinh tế, mật khẩu mà bạn nhập sẽ được chuyển thành
một chuỗi dài các kí tự bằng một thứ gọi là hash function (tạm dịch: hàm băm).
Chuỗi này sẽ được lưu vào cơ sở dữ liệu, chứ không lưu mật khẩu thô của bạn
nhằm tăng tính bảo mật. Lỡ hacker có trộm dữ liệu thì cũng chỉ thấy những thứ
như FIiyXYB547bhvyuuUIbZ chứ khơng biết password thật của bạn là gì.
Mỗi lần bạn đăng nhập, hash function sẽ “băm” password thật của bạn thành chuỗi
kí tự rồi so sánh nó với cái trong cơ sở dữ liệu, nếu khớp thì đăng nhập tiếp, khơng


thì báo lỗi. Chúng ta khơng có nhu cầu dịch ngược chuỗi nói trên ra lại thành
password thật để làm gì cả.


Nói thêm về hash function, nhiệm vụ của nó là chuyển một chuỗi có độ dài bất
kì thành chuỗi kí tự có độ dài cố định. Ví dụ, nếu bạn quy định chuỗi kí tự sau khi
“băm” sẽ dài 10 kí tự thì dù đầu vào của bạn có bao nhiêu chữ đi nữa thì kết quả
nhận được sẽ ln là 10 và chỉ 10 kí tự mà thơi.
Đặc điểm của hash function là trong cùng 1 điều kiện, dữ liệu đầu vào như nhau thì
kết quả sau khi băm cũng sẽ y hệt như nhau. Nếu chỉ đổi một chút xíu thơi, có khi
chỉ là 1 kí tự nhỏ thì chuỗi kết quả sẽ khác hồn tồn.
Cũng vì vậy mà người ta dùng hash function để kiểm tra tính tồn vẹn của dữ liệu.
Ví dụ, trước khi gửi một tập tin Word cho người bạn thì mình dùng mã hóa một
chiều và tạo ra được chuỗi sau băm là DFYUBUfyeufuefu. Khi người bạn đó tải
tập tin về máy, nếu nó băm và cũng nhận được chuỗi DFYUBUfyeufuefu thì có
nghĩa là tập tin của mình khơng bị can thiệp bởi hacker, cịn nếu kết quả khác thì
có nghĩa là q trình truyền tải có thể đã bị lỗi làm mất một phần dữ liệu, hoặc tệ
hơn là có ai đó đã xén bớt hay thêm vào thứ gì đó rồi.
Hiện nay, hai thuật toán hash function thường được dùng nhất là MD5 và SHA.
Nếu bạn tải tập tin trên mạng thì đơi khi sẽ thấy dịng chữ MD5 do tác giả cung
cấp, mục đích là để bạn so sánh file đã tải về với file gốc xem có bị lỗi gì khơng.


2.3 Mã hóa đối xứng (symmetric key encryption)
Chúng ta bắt đầu đi tìm hiểu về việc bảo mật có dùng khóa. Khóa ở đây được gọi
là “key”, nó là mấu chốt để thuật tốn có thể nhìn vào mà biết đường mã hóa và
giải mã dữ liệu.
Cũng giống như cánh cửa nhà của bạn, nếu bạn có khóa thì bạn có thể nhanh chóng
đi vào trong, cịn khơng có khóa thì bạn vẫn có thể đục cửa hay kêu thợ sửa khóa,
nhưng sẽ tốn thời gian và cơng sức hơn. Mỗi chìa khóa cho mỗi ổ khóa trên thế
giới là duy nhất với các đường rãnh khơng chìa nào giống chìa nào – key mã hóa
cũng tương tự như vậy.
Ở phương pháp mã hóa đối xứng, chìa khóa để mã hóa và giải mã là như nhau nên
người ta mới gọi là đối xứng, tiếng Anh là symmetric. Theo một số tài liệu thì mã

hóa đối xứng là giải pháp được sử dụng nhất phổ biến hiện nay.
Giả sử mình cần mã hóa một tập tin để gửi cho bạn, thì quy trình sẽ như sau:
1. Mình sử dụng một thuật tốn mã hóa, cộng với khóa của mình để mã

hóa file (cách tạo khóa tạm thời khơng bàn đến, chủ yếu là dùng các
giải thuật ngẫu nhiên).
2. Bằng cách nào đó, mình giao cho bạn một khóa giống với mình, có

thể là giao trước hoặc sau khi mã hóa tập tin đều được.
3. Khi bạn nhận tập tin, bạn sẽ dùng khóa này để giải mã ra tập tin gốc

có thể đọc được.


Vấn đề ở đây, đó là mình phải làm sao để chuyển khóa cho bạn một cách an tồn.
Nếu khóa này bị lộ ra thì bất kì ai cũng có thể xài thuật tốn nói trên để giải mã tập
tin, như vậy thì tính bảo mật sẽ khơng cịn nữa.
Ngày nay người ta thường xài password như là khóa, và bằng cách này bạn có thể
nhanh chóng nhắn cho người nhận cùng đoạn password đó để xài làm khóa giải
mã.
Các thuật tốn mã hóa thường thấy bây giờ là DES và AES. Trong đó, AES phổ
biến trong thế giới hiện đại hơn và nó dùng để thay thế cho DES vốn đã xuất hiện
từ năm 1977. Hiện nay nhiều cơ quan chính phủ trên thế giới quy định tài liệu khi
được gửi qua mạng phải bằng thuật toán AES.
Thuật toán AES có thể dùng nhiều kích thước ơ nhớ khác nhau để mã hóa dữ liệu,
thường thấy là 128-bit và 256-bit, có một số lên tới 512-bit và 1024-bit. Kích thước
ơ nhớ càng lớn thì càng khó phá mã hơn, bù lại việc giải mã và mã hóa cũng cần
nhiều năng lực xử lý hơn.
Hiện chế độ mã hóa mặc định của Android 5.0 đang xài là AES 128-bit. Điều này
có nghĩa là mỗi khi bạn chuẩn bị ghi dữ liệu xuống bộ nhớ máy thì hệ điều hành sẽ

mã hóa nó rồi mới tiến hành ghi.
Tương tự, mỗi khi OS chuẩn bị đọc dữ liệu thì Android phải giải mã trước rồi mới
chuyển ra ngồi, khi đó thì hình ảnh mới hiện ra được, các tập tin nhạc mới chơi
được và tài liệu mới có thể đọc được. Bằng cách này, nếu bạn có lỡ làm mất máy
thì người lượm được cũng không thể xem trộm dữ liệu của bạn (giả sử bạn đã lock
màn hình).
Nếu người đó có gỡ chip nhớ ra để đọc thì dữ liệu cũng đã mã hóa hết. Tất nhiên,
Android cũng xài key dạng symmetric (tạo ra dựa vào password của bạn), và key
đó còn được băm thêm một lần nữa bằng SHA 256-bit để tăng tính an tồn.
Mình khơng có tài liệu về Windows 10 và OS X, nhưng cơ chế mã hóa của cả hai
hệ điều hành này có vẻ như cũng tương tự, tức là xài AES và xài key tạo ra bằng
password kết hợp thêm SHA.


2.4 Mã hóa bất đối xứng (public key encryption)
Nếu như ở trên, khóa mã hóa và khóa giải mã đều giống nhau thì với phương
pháp bất đối xứng, hai khóa này hoàn toàn khác nhau. Để phân biệt giữa hai khóa
thì người ta gọi khóa mã hóa là public key, cịn khóa giải mã là private key.
Public, như cái tên đã gợi ý, mang tính chất “cơng cộng” và có thể được sử dụng
để mã hóa dữ liệu bởi bất kì ai. Tuy nhiên, chỉ người nào nằm trong tay private key
mới có khả năng giải mã dữ liệu để xem.
Quy trình mã hóa bất đối xứng như sau:
1. Bên nhận sẽ tạo ra một cặp public + private key. Người này giữ lại

private key cho riêng mình và cất cẩn thận, cịn public key thì chuyển
cho bên gửi (dưới hình thức email, copy qua USB, v.v) hoặc post đâu
đó lên mạng.
2. Bên gửi sử dụng public key để mã hóa dữ liệu, sau đó gửi file đã mã

hóa lại cho bên nhận.

3. Bên nhận lúc này sẽ xài private key đã lưu khi nãy để giải mã dữ liệu

và sử dụng.


Đơn giản đúng khơng?
Một nhược điểm của mã hóa bất đối xứng đó là tốc độ giải mã chậm hơn so với
phương thức đối xứng; tức là phải tốn nhiều năng lực xử lý của CPU hơn, phải chờ
lâu hơn, dẫn đến “chi phí” cao hơn. Khoảng thời gian lâu hơn là bao nhiêu thì cịn
tùy vào thuật tốn, cách thức mã hóa và key.
Chính vì thế mà hiện tại ít ai mã hóa cả một file bằng phương pháp bất đối xứng.
Thay vào đó, họ xài phương pháp bất đối xứng để mã hóa chính cái key dùng
trong mã hóa đối xứng (hoặc tạo ra key đó bằng cách tổng hợp public và private
key của bên gửi và nhận).
Như đã nói ở trên, mã hóa đối xứng có nhược điểm là key bị lộ là coi như xong
đời, vậy thì giờ chúng ta mã hóa ln cái key đó cho an tồn và có thể gửi key
thoải mái hơn. Một khi đã giải mã bất đối xứng để ra key gốc rồi thì tiến hành giải
mã thêm lần nữa bằng phương pháp đối xứng để ra file ban đầu.
Một thuật tốn mã hóa thường được xài là RSA.

3.Ứng dụng của mã hóa
Ứng dụng của phương thức này chủ yếu để tránh những cái nhìn soi mói của
những người tị mị tọc mạch, nói chung là những người mà bạn khơng muốn thơng
tin của mình lộ ra ngồi. HTTPS là một ví dụ, nó dùng thuật tốn TLS (lai giữa đối
xứng và bất đối xứng) để mã hóa dữ liệu của bạn khi gửi thơng tin giữa trình duyệt
và máy chủ.
Bằng cách này, những kẻ tọc mạch với hi vọng đánh cắp dữ liệu trong lúc dữ liệu
đang được gửi đi sẽ khơng biết chính xác dữ liệu là gì (do chúng không nắm được
key trong tay).



HTTPS là dạng mã hóa thơng tin đang di chuyển, và người ta cịn có thể dùng mã
hóa để đảm bảo an toàn cho rất nhiều thứ khác, từ email, thông tin di động,
Bluetooth cho đến ứng dụng vào các máy ATM. Ngồi ra, người ta cịn mã hóa dữ
liệu đang nằm n, ví dụ như mấy tấm hình trong máy, các tập tin đã lưu vô ổ cứng
hoặc cơ sở dữ liệu của các công ty.


Một chiếc USB Flash Drive có chức năng mã hóa bằng mật khẩu.
Nhiều USB Flash Drive ngày nay cũng cung cấp phần mềm AES đi kèm để bạn có
thể mã hóa dữ liệu của mình thơng qua mật khẩu (password), nếu lỡ có làm rớt mất
USB thì cũng khơng lo bị ai đó lấy trộm dữ liệu chứa bên trong. Ngay cả khi kẻ
xấu cố gắng gỡ chip ra, gắn vào một phần cứng khác để đọc thì cũng chỉ thấy dữ
liệu đã khơng cịn có thể đọc được mà thơi.
Chúng ta cũng hay nghe đến “chữ kí điện tử”, thứ mà các doanh nghiệp hay sử
dụng để đính kèm vào tài liệu để chứng minh rằng chính họ là người soạn thảo tài
liệu chứ không phải là ai khác giả mạo. “Chữ kí” đó cũng được tạo ra dựa trên
những phương pháp bảo mật nói trên. Thời sơ khai người ta xài RSA, sau này có
những thứ tiên tiến hơn, an toàn hơn được phát triển thêm và nhanh chóng phổ
biến ra tồn thế giới.


Tất nhiên, khơng có gì là an tồn tuyệt đối 100%. Mã hóa RSA đơi khi vẫn có thể
bị phá mã nếu sử dụng một cái máy tính đủ mạnh chạy trong thời gian đủ lâu. Mã
hóa HTTPS cũng có cách để khai thác lỗ hổng trong cơ chế và ăn cắp dữ liệu.
Chính vì thế mà mới có nhiều vụ tấn công xảy ra trên thế giới công nghệ ngày nay.
Một số người bày tỏ lo ngại rằng mã hóa sẽ khiến các cơ quan chính phủ gặp khó
khăn trong việc chống khủng bố hoặc theo dõi thông tin tình báo. Hiện vẫn cịn
nhiều luồng ý kiến trái chiều về điều này, nhưng theo CEO Tim Cook của Apple thì
một khi bạn đã cố tình để lại “lỗ hổng” cho cơ quan chính phủ thì khơng có gì đảm

bảo rằng “lỗ hổng” đó sẽ khơng bị khai thác bởi những người xấu.
Do đó, cách tốt nhất là cố gắng hồn thiện hệ thống và khơng để lại “lỗ hổng” một
cách cố ý cho bất kì ai cả. Việc mở “lỗ hổng” không phải là cách đúng đắn để giải
quyết vấn đề khủng bố.

Chương 2 Mã hóa dữ liệu bằng Python
Đầu tiên, chúng ta cần cài đặt thư viện mật mã:
pip3 install cryptography
Từ thư viện mật mã, chúng ta cần nhập
Fernet
và bắt đầu tạo một khóa - khóa này là cần thiết để mã hóa / giải mã đối xứng.
Tạo khóa
Để tạo một khóa, chúng tơi gọi
generate_key()
phương pháp:
from cryptography.fernet import Fernet def generate_key():
'''
Generates a key and save it into a file
'''
key = Fernet.generate_key()


with open('secret.key', 'wb') as key_file:
key_file.write(key)
Chúng ta chỉ cần thực hiện phương thức trên một lần để tạo khóa.
Nạp chìa khóa
Khi chúng tơi đã tạo khóa, chúng tơi cần tải khóa trong phương thức của mình để
mã hóa dữ liệu:
Def
'''

Loads the key named `secret.key`
'''
return open('secret.key', 'rb').read()

load_key():
from

the

current

directory.

Mã hóa một tin nhắn
Bây giờ, chúng tơi đã sẵn sàng để mã hóa một tin nhắn. Đây là một quy trình ba
bước:


1 - mã hóa tin nhắn



2 - khởi tạo lớp Fernet



3 - chuyển thơng điệp được mã hóa tới encrypt()phương pháp
mã hóa tin nhắn:
message = 'message I want to encrypt'.encode()
khởi tạo lớp Fernet:

f = Fernet(key)
mã hóa tin nhắn:


encrypted_message = f.encrypt(message)
Ví dụ về mã đầy đủ
Dưới đây là một ví dụ hoạt động đầy đủ về mã hóa thư trong python:
From
cryptography.fernet
import
Fernet
def
generate_key():
'''
Generates
a
key
and
save
it
into
a
file
'''
key
=
Fernet.generate_key()
with
open('secret.key',
'wb')

as
key_file:
key_file.write(key)
def
load_key():
'''
Load
the
previously
generated
key
'''
return
open('secret.key',
'rb').read()
def
encrypt_message(message):
'''
Encrypts
a
message
'''
key
=
load_key()
encoded_message
=
message.encode()
f
=

Fernet(key)
encrypted_message
=
f.encrypt(encoded_message)
print(encrypted_message)
if
__name__
==
'__main__':
encrypt_message('encrypt this message')
Đầu ra:
b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfztcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4='


Giải mã dữ liệu bằng Python
Để giải mã tin nhắn, chúng ta chỉ cần gọi decrypt() phương thức từ Fernet thư viện.
Hãy nhớ rằng, chúng ta cũng cần phải tải khóa, vì khóa cần thiết để giải mã thơng
điệp.
from cryptography.fernet import Fernet def load_key():
'''
Load the previously generated key
'''
return open('secret.key', 'rb').read() def decrypt_message(encrypted_message):
'''
Decrypts an encrypted message
'''
key = load_key()
f = Fernet(key)
decrypted_message = f.decrypt(encrypted_message)
print(decrypted_message.decode()) if __name__ == '__main__':

decrypt_message(b'gAAAAABesCUIAcM8M-_Ik_-I1-JD0AzLZU8A8AJITYCp9Mc33JaHMnYmRedtwC8LLcYk9zpTqYSaDaqFUgfztcHZ2TQjAgKKnIWJ2ae9GDoea6tw8XeJ4=')
Đầu ra:
encrypt this message
KẾT LUẬN:

Do khả năng và trình độ cịn hạn chế, thời gian thực tập còn hạn hẹp, kinh nghiệm
thực tế của bản thân cịn có hạn nên báo cáo của chúng em khơng thể tránh khỏi
những sai sót nhất định. Vì vậy em mong được sự góp ý kịp thời của thầy GS. Lê
Đắc Nhường, để báo cáo của nhóm chúng em được hồn thiện và đầy đủ hơn.
Một lần nữa nhóm chúng em xin cảm ơn Thầy GS. Lê Đắc Nhường và bộ mơn
Lập Trình PyThon đã giúp nhóm chúng em hồn thành bài báo cáo thực tập này.
Chúng em chân thành cảm ơn!



×