Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 24

Biểu thức:

a mod n=r
 Lưu ý: +Nếu a<n thì a mod n=a
+Nếu a<0 thì cộng a và n cho đến khi nhận được số nguyên đầu tiên
+Nếu a chia hết cho n thì r=0

VD: 101mod11=2 -11mod3=1


20mod5=0 3mod7=3

•Thuật Toán Euclid mở rộng:

Ta cần dùng phép toán Euclid mở rộng để tìm được ma trận nghịch đảo của ma
trận khóa K trên một module vành Zm tương ứng, với điều kiện K khả nghịch.
Thuật toán Euclid có dạng:
ax+by=c
Vd: Tính 550-1 mod 1759
=>tìm x sao cho 550x=1 (mod 1759)
tức là cần tìm biểu diễn 550x + 1759y = 1
1.
1759 = 3*550+ 109 1) 109 = 1759 - 3*550
2.
1.
550 = 5*109 + 5 2) 550 = 5(1759 - 3*550) + 5
2.
5 = (-5)*1759 + 16*550
1.
109 = 21*5 + 4 3) (1759-3*550) = 21((-5)*1759 + 16*550) + 4
2.
4 = 106*1759 - 339*550
1.
5 = 1*4 + 1 4) ((-5)*1759 + 16*550) = 1*(106*1759 - 339*550) + 1
2.
1 = (-111)*1759 + 335*550
1.
4 = 4*1 +0
2.
Từ đó ta biết được 550-1 mod 1759 = 335 mod 1759
b. Các bước tìm ma trận nghịch đảo của ma trận khoá K:
K-1=
1det (K)
*Adj(K)mod26
Bước 1: Tìm định thức của ma trận K và tính định thức trên mod26.
Bước 2: Tìm ma trận Adj(K) và tính ma trận trên mod26.
Bước 3: Tính nghịch đảo của module bằng phép toán Euclid mở rộng.
Bước 4: Tìm ma trận K-1.
3. Ma trận khả nghịch trên Z26
 Nếu ma trận vuông A cấp m trên (Z26) có det(A) khả nghịch trên (Z26) thì bản
thân ma trận A khả nghịch trên (Z26).
 Tức là: ta có det(A)≠0 và det(A) khả nghịch trên (Z26) thì ước chung lớn nhất
(UCLN): UCLN(det(A), 26)=1 thì khi đó ma trận A khả nghịch trên (Z26).
 Điều kiện cần và đủ để ma trận vuông A khả nghịch là det(A)≠0, nếu
det(A)=0 thì không tồn tại ma trận nghịch đảo.
 Ta cần có ma trận nghịch đảo của ma trận khoá K để giải văn bản mã.
4. Quy trình mã hóa và giải mã
Ta có bảng quy ước :

0 1 2 3 4 5 6 7 8 9 10 11 12
A B C D E F G H I J K L M
13 14 15 16 17 18 19 20 21 22 23 24 25
N O P Q R S T U V W X Y Z

Để mã hóa một đoạn văn bản, ta cần:


Bước 1: Chọn một ma trận chìa khóa (key) K là một ma trận vuông có kích thước
nxn khả nghịch mà người gửi và người nhận biết trước. Lưu ý: định thức của ma
trận này phải là nguyên tố cùng nhau với số 26
Bước 2: Chia thông điệp thành các khối có độ dài bằng kích thước n của ma trận.
Sau đó, mỗi khối sẽ được biểu diễn bằng một vector cột có độ dài n, trong đó mỗi
phần tử là một số tương ứng với một ký tự trong bảng chữ cái.
Bước 3: Ta nhân ma trận khóa K với vector cột này để tạo ra một vector mã hóa.
Cuối cùng, các số trong vector mã hóa sẽ được chuyển đổi thành các ký tự tương
ứng trong bảng chữ cái và các ký tự này được ghép lại để tạo thành một đoạn văn
bản đã được mã hóa.
Lưu ý: Đối với các ký tự không thuộc bảng chữ cái, ta có thể thay thế các số ngoài
giới hạn [0, 26] bởi các đồng dư của nó theo mô-đun 27, ta sẽ được một ma trận
mới
là B’, tiếp theo ta thay thế mỗi số trong ma trận B’ bởi các kí tự trong bảng quy
ước.
Để giải mã, ta chỉ cần nhân ma trận nghịch đảo của ma trận khóa với vector mã
hóa để tìm lại đoạn văn bản gốc.
4.1. Mở rộng: Mã hóa và giải mã mật mã Hill bằng tiếng Việt dựa
trên vành Z94:
Đối với một mật mã Hill tiêu chuẩn, người ta thường mã hóa và giải mã trên vành
Z26:
Để thuận tiện cho việc mã hóa và giải mã Hill bằng tiếng Việt, ta quy định vành
Z94:
a)Mã hóa:
Hàm mã hoá theo cột: ek(p)=K.p
Hàm mã hoá theo hàng: ek(p)=p.K
Để mã hóa một chuỗi ký tự (bản rõ), đầu tiên ta cần một ma trận chìa khóa K (K là
ma trận vuông, cấp m, khả nghịch). Ta chia bản rõ thành từng hàng (cột) có số ký
tự bằng số cấp của ma trận K. Ta thực hiện phép nhân dựa trên 1 trong 2 công thức
trên, thay thế các số nằm ngoài giới hạn [0;94] bởi các đồng dư của chúng, ta thu
được các ma trận mã hóa C.
Thay thế các số trong ma trận C tìm được bằng các giá trị tương đương trên bảng
quy tắc, ta thu được thông điệp đã mã hóa.
b)Giải mã:
Hàm giải mã theo cột: dk(c)=K-1.c
Hàm giải mã: dk(c)=c.K-1
Để giải mã một chuỗi ký tự đã mã hóa, trước tiên ta cần tìm ma trận nghịch đảo
của K theo module của Z94. Ta dựa theo bảng quy tắc tìm lại những ma trận mã
hóa C, thực hiện phép nhân các ma trận C và K-1 theo 1 trong 2 công thức trên, thay
thế các số nằm ngoài giới hạn [0;94] bởi các đồng dư của chúng, ta thu được các
ma trận giải mã P.
Thay thế các số trong ma trận P tìm được bằng các giá trị tương đương trên bảng
quy tắc, ta thu được thông điệp đã giải mã.
5. Các ví dụ minh họa

Ví dụ 1:
aMã hóa bản rõ “HELLO WORLD” bằng hệ mã Hill sử dụng khóa
K= [Phương trình]

b)Giải mã bảng mã ở câu a

Giải: a)Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ thành từng phần 3 kí
tự và ánh xạ vào Z26, do số kí tự của bản rõ không chia hết cho 3 nên ta thêm n kí
tự ngẫu nhiên thuộc Z26 để bản rõ tương thích với khóa K:
H E L L O X W O R L D X
7 4 11 11 14 23 22 14 17 11 3 23

[Phương trình] = [Phương trình]; [Phương trình] = [Phương trình] ; [Phương


trình] = [Phương trình] ; [Phương trình] = [Phương trình]
Hàm mã hóa EK (P) = K.P mod 26,ta có:
[Phương trình] =K.[Phương trình]mod 26 =[Phương trình] [Phương trình]mod
26 =[Phương trình]mod 26 =[Phương trình] =[Phương trình]
[Phương trình]=K.[Phương trình]mod 26=[Phương trình]mod 26 =[Phương
trình]mod 26=[Phương trình] =[Phương trình]
[Phương trình]=K.[Phương trình]mod 26 =[Phương trình]mod 26 =[Phương
trình]mod 26=[Phương trình] =[Phương trình]
[Phương trình]=K.[Phương trình]mod 26=[Phương trình]mod 26=[Phương
trình]mod 26=[Phương trình]=[Phương trình]
 Bản mã EK thu được là IIX UET VFF POX
b) Để giải bản mã ở câu a ta cần tìm K-1
K-1 =
1detK
Adj K mod 26
K=[Phương trình]
Adj K mod 26 = [Phương trình] mod 26 = [Phương trình]
Þ K-1 =
123
[Phương trình] mod 26
Áp dụng thuật toán Euclid
Ta có: 23-1 mod 26
1) 26 = 1*23 + 3
2) 23 = 7*3 + 2
3) 3 = 1*2 + 1
4) 2 = 1*2 + 0
Phần mở rộng
1) 3 = 26 - 1*23
2) 23 = 7*( 26 - 1*23 ) = 2 Û 2 = 8*23 - 7*26
3) (26 - 1*23) = 1* (8*23 - 7*26) + 1 Û 1= 8*26 -9*23
Þ Nhận biểu thức mở rộng tại 3) 1= 8*26 - 9*23
Ta có: -9 mod 26 = 17
Þ K-1 = 17 [Phương trình] mod 26 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 26 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 26 = [Phương trình] mod 26=[Phương trình] mod 26
=[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 26
[Phương trình]=K-1.[Phương trình]mod 26 =[Phương trình]mod 26=[Phương
trình]mod 26=[Phương trình]=[Phương trình]
[Phương trình]=K-1 .[Phương trình]mod 26 =[Phương trình] mod 26=[Phương
trình]mod 26 =[Phương trình] =[Phương trình]
[Phương trình]=K-1 . [Phương trình] mod 26 =[Phương trình] mod 26
=[Phương trình]mod 26 =[Phương trình]=[Phương trình]
[Phương trình]=K-1 .[Phương trình] mod 26=[Phương trình] mod26=[Phương
trình][Phương trình]
 Bản rõ thu được là “HELLOXWORLDX”.Loại bỏ những kí tự gán ngẫu nhiên
ta thu được dữ liệu ban đầu: “HELLO WORLD”.
Ví dụ 2
a)Mã hóa bản rõ “PINK FLOYD’’ bằng hệ mã Hill sử dụng khóa K=[Phương
trình]
b)Giải bản mã ở câu a
Giải
a Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ từng phần 3 kí tự và ánh xạ
vào Z26
P I N K F L O Y D
15 8 13 10 5 11 14 24 3
[Phương trình] = [Phương trình] ; [Phương trình] = [Phương trình] ;
[Phương trình] = [Phương trình]
 Hàm mã hóa eK (p) = K.p mod 26,ta có:
[Phương trình]=K.[Phương trình] mod 26=[Phương trình] mod 26 =[Phương
trình]=[Phương trình]
[Phương trình]=K.[Phương trình] mod 26 =[Phương trình]=[Phương trình]
[Phương trình]=K.[Phương trình] [Phương trình]mod 26=[Phương trình]

Þ Bản mã eK thu được là : OEH YLF LJD


b) Để giải mã bài toán ở câu a cần tìm K-1
K-1 =
1detK
.Adj K mod 26
K=[Phương trình]
Adj K mod 26 = [Phương trình] mod 26 = [Phương trình]
Þ K-1 =
123
[Phương trình] mod 26
Áp dụng thuật toán Euclid
Ta có: 23-1 mod 26
1) 26 = 1*23 + 3
2) 23 = 7*3 + 2
3) 3 = 1*2 + 1
4) 2 = 1*2 + 0
Phần mở rộng
1) 3 = 26 - 1*23
2) 23 = 7*( 26 - 1*23 ) = 2 Û 2 = 8*23 - 7*26
3) (26 - 1*23) = 1* (8*23 - 7*26) + 1 Û 1= 8*26 -9*23
Þ Nhận biểu thức mở rộng tại 3) 1= 8*26 - 9*23
Ta có: -9 mod 26 = 17
Þ K-1 = 17 [Phương trình] mod 26 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 26 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 26 = [Phương trình] mod 26=[Phương trình] mod 26
=[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 26
[Phương trình]=K-1 .[Phương trình]
[Phương trình]=K-1 .[Phương trình]
[Phương trình]=K-1 .[Phương trình] mod 26=[Phương trình]=[Phương trình]
Þ Bản rõ dK thu được là “PINK FLOYD”
Ví dụ 3:
a) Mã hóa bản rõ “ VẬT LÝ ’’ bằng hệ mã Hill sử dụng khóa K=[Phương trình]
b Giải bản mã ở câu a
Giải
a Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ từng phần 3 kí tự và ánh xạ
vào Z94 , quy ước khoảng trống là dấu “”
V Ậ T  L Ý
82 18 69 0 44 85
[Phương trình] = [Phương trình] ; [Phương trình] = [Phương trình]
 Hàm mã hóa: eK (p)  K.p mod 94,ta có:
[Phương trình]=K. [Phương trình]=[Phương trình]
[Phương trình]=K. [Phương trình] mod 94=[Phương trình] = [Phương trình]
 Bản mã eK thu được là: GBX ÃỒÈ
b Để giải bản mã ở câu a cần tìm K-1
K-1 =
1detK
.Adj K mod 94
K=[Phương trình]
Adj K mod 94 = [Phương trình] mod 94 = [Phương trình]
Þ K-1 =
149
[Phương trình] mod 94
Áp dụng thuật toán Euclid
Ta có: 49-1 mod 94
1) 94 = 1*49 + 45
2) 49 = 1*45 + 4
3) 45 = 11*4 + 1
4) 4 = 4*1 + 0
Phần mở rộng
1) 45 = 1*49 + 94
2) 49 = 1*( (-1)*49 + 94 )) + 4 Û 4 = -1*94 + 2*49
3) (94 - 1*49) = 11* (2*49 - 1*94) + 1 Û 1= 12*94 -23*49
Þ Nhận biểu thức mở rộng tại 3) 1= 12*94 - 23*49
Ta có: - 23 mod 94 = 71
Þ K-1 = 71 [Phương trình] mod 94 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 26 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 94 =[Phương trình] [Phương trình] mod 94= [Phương
trình]mod 94 =[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 94
[Phương trình]=K-1 .[Phương trình]
[Phương trình]=K-1[Phương trình] [Phương trình]mod 94=[Phương trình]
Þ Bản rõ dK thu được là VẬT - LÝ

Ví dụ 4:
a) Mã hóa bản rõ “ GIẢI TÍCH ’’ bằng hệ mã Hill sử dụng khóa K=[Phương
trình]
b Giải bản mã ở câu a
Giải
a Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ từng phần 3 kí tự và ánh xạ
vào Z94 , quy ước khoảng trống là dấu “”
G I Ả I  T Í C H
35 37 4 37 0 69 38 20 36
[Phương trình] = [Phương trình] ; [Phương trình] = [Phương trình] ;
[Phương trình] = [Phương trình]
 Hàm mã hóa: eK (p)  K.p mod 94,ta có:
[Phương trình]=K.[Phương trình]=[Phương trình]
[Phương trình]=K.[Phương trình]mod 94=[Phương trình] = [Phương trình]
[Phương trình]=K.[Phương trình]mod 94= [Phương trình]= [Phương trình]
 Bản mã eK thu được là: FÉM ỨÀU ẮLI
b Để giải bản mã ở câu a cần tìm K-1
K-1 =
1detK
.Adj K mod 94
K=[Phương trình]
Adj K mod 94 = [Phương trình] mod 94 = [Phương trình]
Þ K-1 =
155
[Phương trình]mod 94
Áp dụng thuật toán Euclid
Ta có: 55-1 mod 94
1) 94 = 1*55 + 39
2) 55 = 1*39 + 16
3) 39 = 2*7 + 2
4) 16 = 4*1 + 0
5) 7 = 3*2 + 1
6) 2 = 2*1 + 0
Phần mở rộng
1) 39 = 94 - 1*55
2) 55 = 1*( 94 - 1*55 ) + 16 Û 16 = -1*94 + 2*55
3) (94 - 1*55) = 2* (2*55 - 1*49) + 7 Û 7= 3*94 -5*55
4) (2*55 - 1*94) = 2*(3*94 - 5*55) + 2 Û 2 = 12*55 - 7*94
5) (3*94 - 5*55) = 3*(12*55 - 7*94) Û 1= ( 24*94 - 41*55 )
Þ Nhận biểu thức mở rộng tại 5) 1= ( 24*94 - 41*55 )

Ta có: - 41 mod 94 = 53
Þ K-1 = 53 [Phương trình] mod 94 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 94 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 94 =[Phương trình] [Phương trình] mod 94= [Phương
trình]mod 94 =[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 94
[Phương trình]=K-1 [Phương trình]

[Phương trình]= K-1 . [Phương trình] mod 94=[Phương trình]

[Phương trình]= K-1 [Phương trình] mod 94=[Phương trình]


Þ Bản rõ dK thu được là: GIẢI - TÍCH
III – THUẬT TOÁN VÀ CODE PYTHON
1. Sơ lược về Python
Python là một ngôn ngữ lập trình thông dụng, đa mục đích, và có nguồn mở.
Python được thiết kế để đọc dễ hiểu và có cú pháp gọn gàng, giúp người lập trình
viết mã một cách dễ dàng và nhanh chóng.

 Lí do chọn sử dụng Python để giải quyết bài toán mã hóa mã Hill:


+ Dễ dàng thao thác với ma trận: Python có nhiều ứng dụng trong việc thực hiện
các phép toán đại số tuyến tính như phép cộng, trừ, nhân ma trận, tích vô hướng,
tích chóp..v.v.
+ Thư viện mạnh mẽ: Python cung cấp nhiều thư viện mạnh mẽ có thể kể đến
như: NumPy – là thư viện cung cấp các cấu trúc dữ liệu, chức năng, thuật toán tiện
ích để làm việc với ma trận và vector…
+ Ngôn ngữ lập trình đơn giản, dễ hiểu
2. Chương trình mật mã HILL trên Python
2.1. Chương trình code Python
Một số lệnh được dùng trong bản code Python
Lệnh Ý nghĩa
Import Xuất dữ liệu, sử dụng tài nguyên trong thư viện được
gọi ra, ở đây là Numpy và Sympy, 2 thư viện hỗ trợ tính
toán trên ma trận
Def Def là viết tắt của Definition, như cái tên của nó, hàm
này giúp ta định nghĩa được các công việc cần nhiều
lệnh cùng lúc, gom chúng về thành 1 khối và thực hiện 1
hay nhiều công việc cụ thể
Input Nhập dữ liệu trực tiếp từ bàn phím
Print Lệnh in ra màn hình quen thuộc
Len Hàm kiểm tra, đếm số lượng kí tự có trong 1 chuỗi

a) Chương trình mã hóa:


import numpy as np ( lấy dữ liệu từ thư viện numpy, qui ước đuôi là np)

def ma_hoa(a, b, c, ma_tran_khoa):


pos = np.array([ord(a) - ord('A'), ord(b) - ord('A'), ord(c) - ord('A')])
ket_qua = np.dot(ma_tran_khoa, pos) % 26
return ''.join([chr(val + ord('A')) for val in ket_qua]) ( khối lệnh mã
hóa )

def main(): ( phần thân của chương trình )

nhap_khoa = [[int(x) for x in input(f'Nhập dòng {i+1} của ma trận khóa 3x3
(cách nhau bởi dấu cách): ').split()] for i in range(3)]
( xếp các mảng thành ma trận)
ma_tran_khoa = np.array(nhap_khoa)

tin_nhan = input('Nhập thông điệp: ') ( nhập thông điệp muốn mã hóa từ bàn
phím)
print("Đang mã hóa....\n-------------------------") (make color)
print("Thông điệp nhập vào : " + tin_nhan)
tin_nhan = tin_nhan.upper().replace(" ", "_")
n = len(tin_nhan) % len(ma_tran_khoa)
if n != 0:
for i in range(len(ma_tran_khoa) - n):
tin_nhan += 'X'
print("Thông điệp sau khi đệm: " + tin_nhan)

ma_hoa_tin_nhan = ''.join([ma_hoa(tin_nhan[i], tin_nhan[i + 1], tin_nhan[i


+ 2], ma_tran_khoa) for i in range(0, len(tin_nhan), len(ma_tran_khoa))])
print("Thông điệp đã mã hóa: " + ma_hoa_tin_nhan)

# Sử dụng ví dụ:
main()

BỔ SUNG HÌNH ẢNH CHẠY CODE

b) Chương trình giải mã:


import numpy as np
from sympy import Matrix, mod_inverse

def giai_ma(a, b, c, ma_tran_khoa_nguoc):


pos = np.array([ord(a) - ord('A'), ord(b) - ord('A'), ord(c) - ord('A')])
ket_qua = np.dot(ma_tran_khoa_nguoc, pos) % 26
ket_qua = ket_qua.astype(int)
return ''.join([chr(val + ord('A')) for val in ket_qua])

def main():
nhap_khoa = [[int(x) for x in input(f'Nhập dòng {i+1} của ma trận khóa 3x3
(cách nhau bởi dấu cách): ').split()] for i in range(3)]

try:
ma_tran_khoa_nguoc = Matrix(nhap_khoa).inv_mod(26)
if ma_tran_khoa_nguoc is None:
raise np.linalg.LinAlgError
ma_tran_khoa_nguoc = np.array(ma_tran_khoa_nguoc)
except np.linalg.LinAlgError:
print("Ma trận khóa không thể nghịch đảo. Hãy nhập một ma trận
khác.")
return

tin_nhan = input('Nhập thông điệp cần giải mã: ')


print("Đang giả mã....\n-------------------------")
print("Thông điệp nhập vào : " + tin_nhan)
tin_nhan = tin_nhan.upper().replace(" ", "")

giai_ma_tin_nhan = ''.join([giai_ma(tin_nhan[i], tin_nhan[i + 1],


tin_nhan[i + 2], ma_tran_khoa_nguoc) for i in range(0, len(tin_nhan), 3)])
print("Thông điệp đã giải mã: " + giai_ma_tin_nhan)

# Gọi hàm main


main()

BỔ SUNG HÌNH ẢNH CHẠY CODE

2. Cách hoạt động của chương trình code

3. Ứng dụng nổi trội của mã HILL trong đời sống hiện đại
Ứng dụng của phương pháp mã hóa Hill Cipher trong văn bản được đánh giá cao
vì tốc độ mã hóa và giải mã nhanh chóng. Phương pháp này đặc biệt hiệu quả trong
việc bảo mật dữ liệu truyền qua mạng mở.
 Lĩnh vực quân sự: Hỗ trợ truyền tin giữa các đơn vị quân sự và bảo mật
thông tin về chiến lựơc, ngăn chặn xâm nhập và lộ thông tin quan trọng trong
quân đội.
 Lĩnh vực trao đổi thư tín, tin nhắn: mã hóa tin nhắn văn bản, tệp tin, hình
ảnh, email, hoặc bất kỳ hình thức giao tiếp kỹ thuật số nào; đảm bảo tính bảo
mật và riêng tư của thông tin nhạy cảm
 Lĩnh vực thương mại điện tử: mã hóa giao dịch tài chính và thông tin cá
nhân trong quá trình mua sắm trực tuyến hoặc ngân hàng, nâng cao dữ liệu cá
nhân
 Lĩnh vực Internet of Things (IoT): Với sự phát triển của Internet of Things
(IoT), Hill Cipher có thể được sử dụng để mã hóa dữ liệu truyền qua các thiết bị
IoT, bảo vệ quyền riêng tư và ngăn chặn truy cập trái phép vào thông tin nhạy
cảm.
3.1. Mã hóa đầu cuối – Mã hóa sâu – Bảo mật dữ liệu
a) Mã hóa đầu cuối
Sau khi bản rõ được mã hóa, key giải mã sẽ được gửi đến cá nhân được nhận chỉ
định, chỉ có một key duy nhất. Trong quá trình gửi, không có đơn vị trung gian nào
có thể giải mã được.
Mô hình minh họa:

3.1.2 Bảo mật sâu

3.2. Ví dụ
IV - KẾT LUẬN
V – TÀI LIỆU THAM KHẢO
[1] Giáo trình Đại số tuyến tính – Thầy Đặng Văn Vinh
[2] Wikipedia.org/wiki/Hill_cipher

Biểu thức:
a mod n=r
 Lưu ý: +Nếu a<n thì a mod n=a
+Nếu a<0 thì cộng a và n cho đến khi nhận được số nguyên đầu tiên
+Nếu a chia hết cho n thì r=0

VD: 101mod11=2 -11mod3=1


20mod5=0 3mod7=3

•Thuật Toán Euclid mở rộng:

Ta cần dùng phép toán Euclid mở rộng để tìm được ma trận nghịch đảo của ma
trận khóa K trên một module vành Zm tương ứng, với điều kiện K khả nghịch.
Thuật toán Euclid có dạng:
ax+by=c
Vd: Tính 550-1 mod 1759
=>tìm x sao cho 550x=1 (mod 1759)
tức là cần tìm biểu diễn 550x + 1759y = 1
1.
1759 = 3*550+ 109 1) 109 = 1759 - 3*550
2.
1.
550 = 5*109 + 5 2) 550 = 5(1759 - 3*550) + 5
2.
5 = (-5)*1759 + 16*550
1.
109 = 21*5 + 4 3) (1759-3*550) = 21((-5)*1759 + 16*550) + 4
2.
4 = 106*1759 - 339*550
1.
5 = 1*4 + 1 4) ((-5)*1759 + 16*550) = 1*(106*1759 - 339*550) + 1
2.
1 = (-111)*1759 + 335*550
1.
4 = 4*1 +0
2.
Từ đó ta biết được 550-1 mod 1759 = 335 mod 1759

b. Các bước tìm ma trận nghịch đảo của ma trận khoá K:


K-1=
1det (K)
*Adj(K)mod26
Bước 1: Tìm định thức của ma trận K và tính định thức trên mod26.
Bước 2: Tìm ma trận Adj(K) và tính ma trận trên mod26.
Bước 3: Tính nghịch đảo của module bằng phép toán Euclid mở rộng.
Bước 4: Tìm ma trận K-1.
3. Ma trận khả nghịch trên Z26
 Nếu ma trận vuông A cấp m trên (Z26) có det(A) khả nghịch trên (Z26) thì bản
thân ma trận A khả nghịch trên (Z26).
 Tức là: ta có det(A)≠0 và det(A) khả nghịch trên (Z26) thì ước chung lớn nhất
(UCLN): UCLN(det(A), 26)=1 thì khi đó ma trận A khả nghịch trên (Z26).
 Điều kiện cần và đủ để ma trận vuông A khả nghịch là det(A)≠0, nếu
det(A)=0 thì không tồn tại ma trận nghịch đảo.
 Ta cần có ma trận nghịch đảo của ma trận khoá K để giải văn bản mã.
4. Quy trình mã hóa và giải mã
Ta có bảng quy ước :

0 1 2 3 4 5 6 7 8 9 10 11 12
A B C D E F G H I J K L M
13 14 15 16 17 18 19 20 21 22 23 24 25
N O P Q R S T U V W X Y Z

Để mã hóa một đoạn văn bản, ta cần:


Bước 1: Chọn một ma trận chìa khóa (key) K là một ma trận vuông có kích thước
nxn khả nghịch mà người gửi và người nhận biết trước. Lưu ý: định thức của ma
trận này phải là nguyên tố cùng nhau với số 26
Bước 2: Chia thông điệp thành các khối có độ dài bằng kích thước n của ma trận.
Sau đó, mỗi khối sẽ được biểu diễn bằng một vector cột có độ dài n, trong đó mỗi
phần tử là một số tương ứng với một ký tự trong bảng chữ cái.
Bước 3: Ta nhân ma trận khóa K với vector cột này để tạo ra một vector mã hóa.
Cuối cùng, các số trong vector mã hóa sẽ được chuyển đổi thành các ký tự tương
ứng trong bảng chữ cái và các ký tự này được ghép lại để tạo thành một đoạn văn
bản đã được mã hóa.
Lưu ý: Đối với các ký tự không thuộc bảng chữ cái, ta có thể thay thế các số ngoài
giới hạn [0, 26] bởi các đồng dư của nó theo mô-đun 27, ta sẽ được một ma trận
mới
là B’, tiếp theo ta thay thế mỗi số trong ma trận B’ bởi các kí tự trong bảng quy
ước.
Để giải mã, ta chỉ cần nhân ma trận nghịch đảo của ma trận khóa với vector mã
hóa để tìm lại đoạn văn bản gốc.
4.1. Mở rộng: Mã hóa và giải mã mật mã Hill bằng tiếng Việt dựa
trên vành Z94:
Đối với một mật mã Hill tiêu chuẩn, người ta thường mã hóa và giải mã trên vành
Z26:
Để thuận tiện cho việc mã hóa và giải mã Hill bằng tiếng Việt, ta quy định vành
Z94:
a)Mã hóa:
Hàm mã hoá theo cột: ek(p)=K.p
Hàm mã hoá theo hàng: ek(p)=p.K
Để mã hóa một chuỗi ký tự (bản rõ), đầu tiên ta cần một ma trận chìa khóa K (K là
ma trận vuông, cấp m, khả nghịch). Ta chia bản rõ thành từng hàng (cột) có số ký
tự bằng số cấp của ma trận K. Ta thực hiện phép nhân dựa trên 1 trong 2 công thức
trên, thay thế các số nằm ngoài giới hạn [0;94] bởi các đồng dư của chúng, ta thu
được các ma trận mã hóa C.
Thay thế các số trong ma trận C tìm được bằng các giá trị tương đương trên bảng
quy tắc, ta thu được thông điệp đã mã hóa.
b)Giải mã:
Hàm giải mã theo cột: dk(c)=K-1.c
Hàm giải mã: dk(c)=c.K-1
Để giải mã một chuỗi ký tự đã mã hóa, trước tiên ta cần tìm ma trận nghịch đảo
của K theo module của Z94. Ta dựa theo bảng quy tắc tìm lại những ma trận mã
hóa C, thực hiện phép nhân các ma trận C và K-1 theo 1 trong 2 công thức trên, thay
thế các số nằm ngoài giới hạn [0;94] bởi các đồng dư của chúng, ta thu được các
ma trận giải mã P.
Thay thế các số trong ma trận P tìm được bằng các giá trị tương đương trên bảng
quy tắc, ta thu được thông điệp đã giải mã.
5. Các ví dụ minh họa

Ví dụ 1:
aMã hóa bản rõ “HELLO WORLD” bằng hệ mã Hill sử dụng khóa
K= [Phương trình]

b)Giải mã bảng mã ở câu a

Giải: a)Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ thành từng phần 3 kí
tự và ánh xạ vào Z26, do số kí tự của bản rõ không chia hết cho 3 nên ta thêm n kí
tự ngẫu nhiên thuộc Z26 để bản rõ tương thích với khóa K:
H E L L O X W O R L D X
7 4 11 11 14 23 22 14 17 11 3 23

[Phương trình] = [Phương trình]; [Phương trình] = [Phương trình] ; [Phương


trình] = [Phương trình] ; [Phương trình] = [Phương trình]
Hàm mã hóa EK (P) = K.P mod 26,ta có:
[Phương trình] =K.[Phương trình]mod 26 =[Phương trình] [Phương trình]mod
26 =[Phương trình]mod 26 =[Phương trình] =[Phương trình]
[Phương trình]=K.[Phương trình]mod 26=[Phương trình]mod 26 =[Phương
trình]mod 26=[Phương trình] =[Phương trình]
[Phương trình]=K.[Phương trình]mod 26 =[Phương trình]mod 26 =[Phương
trình]mod 26=[Phương trình] =[Phương trình]
[Phương trình]=K.[Phương trình]mod 26=[Phương trình]mod 26=[Phương
trình]mod 26=[Phương trình]=[Phương trình]
 Bản mã EK thu được là IIX UET VFF POX
b) Để giải bản mã ở câu a ta cần tìm K-1
K-1 =
1detK
Adj K mod 26
K=[Phương trình]
Adj K mod 26 = [Phương trình] mod 26 = [Phương trình]
Þ K-1 =
123
[Phương trình] mod 26
Áp dụng thuật toán Euclid
Ta có: 23-1 mod 26
1) 26 = 1*23 + 3
2) 23 = 7*3 + 2
3) 3 = 1*2 + 1
4) 2 = 1*2 + 0
Phần mở rộng
1) 3 = 26 - 1*23
2) 23 = 7*( 26 - 1*23 ) = 2 Û 2 = 8*23 - 7*26
3) (26 - 1*23) = 1* (8*23 - 7*26) + 1 Û 1= 8*26 -9*23
Þ Nhận biểu thức mở rộng tại 3) 1= 8*26 - 9*23
Ta có: -9 mod 26 = 17
Þ K-1 = 17 [Phương trình] mod 26 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 26 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 26 = [Phương trình] mod 26=[Phương trình] mod 26
=[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 26
[Phương trình]=K-1.[Phương trình]mod 26 =[Phương trình]mod 26=[Phương
trình]mod 26=[Phương trình]=[Phương trình]
[Phương trình]=K-1 .[Phương trình]mod 26 =[Phương trình] mod 26=[Phương
trình]mod 26 =[Phương trình] =[Phương trình]
[Phương trình]=K-1 . [Phương trình] mod 26 =[Phương trình] mod 26
=[Phương trình]mod 26 =[Phương trình]=[Phương trình]
[Phương trình]=K-1 .[Phương trình] mod 26=[Phương trình] mod26=[Phương
trình][Phương trình]
 Bản rõ thu được là “HELLOXWORLDX”.Loại bỏ những kí tự gán ngẫu nhiên
ta thu được dữ liệu ban đầu: “HELLO WORLD”.
Ví dụ 2
a)Mã hóa bản rõ “PINK FLOYD’’ bằng hệ mã Hill sử dụng khóa K=[Phương
trình]
b)Giải bản mã ở câu a
Giải
a Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ từng phần 3 kí tự và ánh xạ
vào Z26
P I N K F L O Y D
15 8 13 10 5 11 14 24 3
[Phương trình] = [Phương trình] ; [Phương trình] = [Phương trình] ;
[Phương trình] = [Phương trình]
 Hàm mã hóa eK (p) = K.p mod 26,ta có:
[Phương trình]=K.[Phương trình] mod 26=[Phương trình] mod 26 =[Phương
trình]=[Phương trình]
[Phương trình]=K.[Phương trình] mod 26 =[Phương trình]=[Phương trình]
[Phương trình]=K.[Phương trình] [Phương trình]mod 26=[Phương trình]

Þ Bản mã eK thu được là : OEH YLF LJD


b) Để giải mã bài toán ở câu a cần tìm K-1
K-1 =
1detK
.Adj K mod 26
K=[Phương trình]
Adj K mod 26 = [Phương trình] mod 26 = [Phương trình]
Þ K-1 =
123
[Phương trình] mod 26
Áp dụng thuật toán Euclid
Ta có: 23-1 mod 26
1) 26 = 1*23 + 3
2) 23 = 7*3 + 2
3) 3 = 1*2 + 1
4) 2 = 1*2 + 0
Phần mở rộng
1) 3 = 26 - 1*23
2) 23 = 7*( 26 - 1*23 ) = 2 Û 2 = 8*23 - 7*26
3) (26 - 1*23) = 1* (8*23 - 7*26) + 1 Û 1= 8*26 -9*23
Þ Nhận biểu thức mở rộng tại 3) 1= 8*26 - 9*23
Ta có: -9 mod 26 = 17
Þ K-1 = 17 [Phương trình] mod 26 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 26 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 26 = [Phương trình] mod 26=[Phương trình] mod 26
=[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 26
[Phương trình]=K-1 .[Phương trình]
[Phương trình]=K-1 .[Phương trình]
[Phương trình]=K-1 .[Phương trình] mod 26=[Phương trình]=[Phương trình]
Þ Bản rõ dK thu được là “PINK FLOYD”
Ví dụ 3:
a) Mã hóa bản rõ “ VẬT LÝ ’’ bằng hệ mã Hill sử dụng khóa K=[Phương trình]
b Giải bản mã ở câu a
Giải
a Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ từng phần 3 kí tự và ánh xạ
vào Z94 , quy ước khoảng trống là dấu “”
V Ậ T  L Ý
82 18 69 0 44 85
[Phương trình] = [Phương trình] ; [Phương trình] = [Phương trình]
 Hàm mã hóa: eK (p)  K.p mod 94,ta có:
[Phương trình]=K. [Phương trình]=[Phương trình]
[Phương trình]=K. [Phương trình] mod 94=[Phương trình] = [Phương trình]
 Bản mã eK thu được là: GBX ÃỒÈ
b Để giải bản mã ở câu a cần tìm K-1
K-1 =
1detK
.Adj K mod 94
K=[Phương trình]
Adj K mod 94 = [Phương trình] mod 94 = [Phương trình]
Þ K-1 =
149
[Phương trình] mod 94
Áp dụng thuật toán Euclid
Ta có: 49-1 mod 94
1) 94 = 1*49 + 45
2) 49 = 1*45 + 4
3) 45 = 11*4 + 1
4) 4 = 4*1 + 0
Phần mở rộng
1) 45 = 1*49 + 94
2) 49 = 1*( (-1)*49 + 94 )) + 4 Û 4 = -1*94 + 2*49
3) (94 - 1*49) = 11* (2*49 - 1*94) + 1 Û 1= 12*94 -23*49
Þ Nhận biểu thức mở rộng tại 3) 1= 12*94 - 23*49
Ta có: - 23 mod 94 = 71
Þ K-1 = 71 [Phương trình] mod 94 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 26 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 94 =[Phương trình] [Phương trình] mod 94= [Phương
trình]mod 94 =[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 94
[Phương trình]=K-1 .[Phương trình]
[Phương trình]=K-1[Phương trình] [Phương trình]mod 94=[Phương trình]
Þ Bản rõ dK thu được là VẬT - LÝ

Ví dụ 4:
a) Mã hóa bản rõ “ GIẢI TÍCH ’’ bằng hệ mã Hill sử dụng khóa K=[Phương
trình]
b Giải bản mã ở câu a
Giải
a Vì khóa K là ma trận vuông cấp 3 nên ta chia bản rõ từng phần 3 kí tự và ánh xạ
vào Z94 , quy ước khoảng trống là dấu “”
G I Ả I  T Í C H
35 37 4 37 0 69 38 20 36
[Phương trình] = [Phương trình] ; [Phương trình] = [Phương trình] ;
[Phương trình] = [Phương trình]
 Hàm mã hóa: eK (p)  K.p mod 94,ta có:
[Phương trình]=K.[Phương trình]=[Phương trình]
[Phương trình]=K.[Phương trình]mod 94=[Phương trình] = [Phương trình]
[Phương trình]=K.[Phương trình]mod 94= [Phương trình]= [Phương trình]
 Bản mã eK thu được là: FÉM ỨÀU ẮLI
b Để giải bản mã ở câu a cần tìm K-1
K-1 =
1detK
.Adj K mod 94
K=[Phương trình]
Adj K mod 94 = [Phương trình] mod 94 = [Phương trình]
Þ K-1 =
155
[Phương trình]mod 94
Áp dụng thuật toán Euclid
Ta có: 55-1 mod 94
1) 94 = 1*55 + 39
2) 55 = 1*39 + 16
3) 39 = 2*7 + 2
4) 16 = 4*1 + 0
5) 7 = 3*2 + 1
6) 2 = 2*1 + 0
Phần mở rộng
1) 39 = 94 - 1*55
2) 55 = 1*( 94 - 1*55 ) + 16 Û 16 = -1*94 + 2*55
3) (94 - 1*55) = 2* (2*55 - 1*49) + 7 Û 7= 3*94 -5*55
4) (2*55 - 1*94) = 2*(3*94 - 5*55) + 2 Û 2 = 12*55 - 7*94
5) (3*94 - 5*55) = 3*(12*55 - 7*94) Û 1= ( 24*94 - 41*55 )
Þ Nhận biểu thức mở rộng tại 5) 1= ( 24*94 - 41*55 )

Ta có: - 41 mod 94 = 53
Þ K-1 = 53 [Phương trình] mod 94 = [Phương trình]
*Kiểm tra K-1
Nếu K.K-1 mod 94 bằng ma trận đơn vị I thì K-1 chính xác
Ta có: K.K-1 mod 94 =[Phương trình] [Phương trình] mod 94= [Phương
trình]mod 94 =[Phương trình] Þ K-1 chính xác
Hàm giải mã : dK (C) = K-1 .C mod 94
[Phương trình]=K-1 [Phương trình]

[Phương trình]= K-1 . [Phương trình] mod 94=[Phương trình]

[Phương trình]= K-1 [Phương trình] mod 94=[Phương trình]


Þ Bản rõ dK thu được là: GIẢI - TÍCH
III – THUẬT TOÁN VÀ CODE PYTHON
1. Sơ lược về Python
Python là một ngôn ngữ lập trình thông dụng, đa mục đích, và có nguồn mở.
Python được thiết kế để đọc dễ hiểu và có cú pháp gọn gàng, giúp người lập trình
viết mã một cách dễ dàng và nhanh chóng.

 Lí do chọn sử dụng Python để giải quyết bài toán mã hóa mã Hill:


+ Dễ dàng thao thác với ma trận: Python có nhiều ứng dụng trong việc thực hiện
các phép toán đại số tuyến tính như phép cộng, trừ, nhân ma trận, tích vô hướng,
tích chóp..v.v.
+ Thư viện mạnh mẽ: Python cung cấp nhiều thư viện mạnh mẽ có thể kể đến
như: NumPy – là thư viện cung cấp các cấu trúc dữ liệu, chức năng, thuật toán tiện
ích để làm việc với ma trận và vector…
+ Ngôn ngữ lập trình đơn giản, dễ hiểu
2. Chương trình mật mã HILL trên Python
2.1. Chương trình code Python
Một số lệnh được dùng trong bản code Python
Lệnh Ý nghĩa
Import Xuất dữ liệu, sử dụng tài nguyên trong thư viện được
gọi ra, ở đây là Numpy và Sympy, 2 thư viện hỗ trợ tính
toán trên ma trận
Def Def là viết tắt của Definition, như cái tên của nó, hàm
này giúp ta định nghĩa được các công việc cần nhiều
lệnh cùng lúc, gom chúng về thành 1 khối và thực hiện 1
hay nhiều công việc cụ thể
Input Nhập dữ liệu trực tiếp từ bàn phím
Print Lệnh in ra màn hình quen thuộc
Len Hàm kiểm tra, đếm số lượng kí tự có trong 1 chuỗi

a) Chương trình mã hóa:


import numpy as np ( lấy dữ liệu từ thư viện numpy, qui ước đuôi là np)

def ma_hoa(a, b, c, ma_tran_khoa):


pos = np.array([ord(a) - ord('A'), ord(b) - ord('A'), ord(c) - ord('A')])
ket_qua = np.dot(ma_tran_khoa, pos) % 26
return ''.join([chr(val + ord('A')) for val in ket_qua]) ( khối lệnh mã
hóa )

def main(): ( phần thân của chương trình )

nhap_khoa = [[int(x) for x in input(f'Nhập dòng {i+1} của ma trận khóa 3x3
(cách nhau bởi dấu cách): ').split()] for i in range(3)]
( xếp các mảng thành ma trận)
ma_tran_khoa = np.array(nhap_khoa)

tin_nhan = input('Nhập thông điệp: ') ( nhập thông điệp muốn mã hóa từ bàn
phím)
print("Đang mã hóa....\n-------------------------") (make color)
print("Thông điệp nhập vào : " + tin_nhan)
tin_nhan = tin_nhan.upper().replace(" ", "_")
n = len(tin_nhan) % len(ma_tran_khoa)
if n != 0:
for i in range(len(ma_tran_khoa) - n):
tin_nhan += 'X'
print("Thông điệp sau khi đệm: " + tin_nhan)

ma_hoa_tin_nhan = ''.join([ma_hoa(tin_nhan[i], tin_nhan[i + 1], tin_nhan[i


+ 2], ma_tran_khoa) for i in range(0, len(tin_nhan), len(ma_tran_khoa))])
print("Thông điệp đã mã hóa: " + ma_hoa_tin_nhan)

# Sử dụng ví dụ:
main()
BỔ SUNG HÌNH ẢNH CHẠY CODE

b) Chương trình giải mã:


import numpy as np
from sympy import Matrix, mod_inverse

def giai_ma(a, b, c, ma_tran_khoa_nguoc):


pos = np.array([ord(a) - ord('A'), ord(b) - ord('A'), ord(c) - ord('A')])
ket_qua = np.dot(ma_tran_khoa_nguoc, pos) % 26
ket_qua = ket_qua.astype(int)
return ''.join([chr(val + ord('A')) for val in ket_qua])

def main():
nhap_khoa = [[int(x) for x in input(f'Nhập dòng {i+1} của ma trận khóa 3x3
(cách nhau bởi dấu cách): ').split()] for i in range(3)]

try:
ma_tran_khoa_nguoc = Matrix(nhap_khoa).inv_mod(26)
if ma_tran_khoa_nguoc is None:
raise np.linalg.LinAlgError
ma_tran_khoa_nguoc = np.array(ma_tran_khoa_nguoc)
except np.linalg.LinAlgError:
print("Ma trận khóa không thể nghịch đảo. Hãy nhập một ma trận
khác.")
return

tin_nhan = input('Nhập thông điệp cần giải mã: ')


print("Đang giả mã....\n-------------------------")
print("Thông điệp nhập vào : " + tin_nhan)
tin_nhan = tin_nhan.upper().replace(" ", "")

giai_ma_tin_nhan = ''.join([giai_ma(tin_nhan[i], tin_nhan[i + 1],


tin_nhan[i + 2], ma_tran_khoa_nguoc) for i in range(0, len(tin_nhan), 3)])
print("Thông điệp đã giải mã: " + giai_ma_tin_nhan)

# Gọi hàm main


main()

BỔ SUNG HÌNH ẢNH CHẠY CODE

2. Cách hoạt động của chương trình code

3. Ứng dụng nổi trội của mã HILL trong đời sống hiện đại
Ứng dụng của phương pháp mã hóa Hill Cipher trong văn bản được đánh giá cao
vì tốc độ mã hóa và giải mã nhanh chóng. Phương pháp này đặc biệt hiệu quả trong
việc bảo mật dữ liệu truyền qua mạng mở.
 Lĩnh vực quân sự: Hỗ trợ truyền tin giữa các đơn vị quân sự và bảo mật
thông tin về chiến lựơc, ngăn chặn xâm nhập và lộ thông tin quan trọng trong
quân đội.
 Lĩnh vực trao đổi thư tín, tin nhắn: mã hóa tin nhắn văn bản, tệp tin, hình
ảnh, email, hoặc bất kỳ hình thức giao tiếp kỹ thuật số nào; đảm bảo tính bảo
mật và riêng tư của thông tin nhạy cảm
 Lĩnh vực thương mại điện tử: mã hóa giao dịch tài chính và thông tin cá
nhân trong quá trình mua sắm trực tuyến hoặc ngân hàng, nâng cao dữ liệu cá
nhân
 Lĩnh vực Internet of Things (IoT): Với sự phát triển của Internet of Things
(IoT), Hill Cipher có thể được sử dụng để mã hóa dữ liệu truyền qua các thiết bị
IoT, bảo vệ quyền riêng tư và ngăn chặn truy cập trái phép vào thông tin nhạy
cảm.
3.1. Mã hóa đầu cuối – Mã hóa sâu – Bảo mật dữ liệu
a) Mã hóa đầu cuối
Sau khi bản rõ được mã hóa, key giải mã sẽ được gửi đến cá nhân được nhận chỉ
định, chỉ có một key duy nhất. Trong quá trình gửi, không có đơn vị trung gian nào
có thể giải mã được.
Mô hình minh họa:

3.1.2 Bảo mật sâu

3.2. Ví dụ
IV - KẾT LUẬN
V – TÀI LIỆU THAM KHẢO
[1] Giáo trình Đại số tuyến tính – Thầy Đặng Văn Vinh
[2] Wikipedia.org/wiki/Hill_cipher

You might also like