Tải bản đầy đủ (.pdf) (61 trang)

báo cáo môn học lý thuyết mật 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 (501.13 KB, 61 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

ĐẠI HỌC BÁCH KHOA HÀ NỘI Trường Điện Đi– ện tử

Khoa Điện tử

Lý thuy t m t mãếậ

Nhóm 12

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

Thông tin và nhiệm vụ từng thành viên:

1. Triệu Hồng Qn (nhóm trưởng). Nhiệm vụ: tổng hợp thơng tin; tìm hiể cơ sở u tốn học lý thuyết mật mã, hệ mật vignere, hệ mật atbash; mô phỏng hệ ống thtruyền thông.

2. Nguyễn Minh Phúc. Nhiệm vụ: tìm hiểu cơ sở tốn học lý thuyết mật mã, hệ mật Hill, chuẩn mã hóa nâng cao AES.

3. Nguyễn Anh Tuấn. Nhiệm vụ: tìm hiểu cơ sở toán học lý thuyết mật mã, hệ mật Caeser, hệ mật affine, hệ mật hiện đại RC4.

4. Đặng Hữu Cơng Hiếu. Nhiệm vụ: tìm hiểu cơ sở toán học lý thuyết mật mã, hệ mật Playfair, hệ mật DES.

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

I. Cơ sở toán học của lý thuyết mật mã

1.1 Số học các số ngu

1.1 Số học các số nguyênyênyên

Nghiên cứu về các tính chất của số nguyên, như tính chia hết, ước số chung, bội số chung, số nguyên tố, thuật toán Euclide, thuật toán Euclide mở rộng, thuật tốn phân tích thừa số ngun tố, thuật tốn RSA, v.v.

• Tập hợp: Sử dụng các tập hợp số nguyên Z, số nguyên không âm với các phép 𝑍<small>+</small>tốn cộng, trừ, nhân

• Cho hai số nguyên bất kỳ a và b , b > 1, ta luôn xác định được q và r sao cho (r là phần dư)

𝑎 = 𝑏 × 𝑞 + 𝑟, 0 < 𝑟 < 𝑏 • Ước chung lớn nhất

𝑑 = gcd(𝑎, 𝑏) • Số nguyên tố

Một số nguyên a > 1 được gọi là số nguyên tố, nếu a khơng có ước số nào ngồi 1 và chính a; và a được gọi là hợp số nếu không phải là số nguyên tố

• Một số nguyên n > 1 bất kỳ đều có thể ết dưới dạng:vi𝑛 = 𝑝<sub>1</sub><sup>𝛼1</sup>. 𝑝<sub>2</sub><small>𝛼2</small>… 𝑝<sub>𝑘</sub><small>𝛼𝑘</small>

Trong đó 1 , 2 , … 𝑝 𝑝 , 𝑝𝑘 là các số nguyên tố khác nhau, 1, 2 , … , 𝛼 𝛼 𝛼𝑘 là các số mũ nguyên dương.

Đây là dạng khai triển chính tắc của n • Định lý:

Nếu 𝑏 > 0 và 𝑏 | 𝑎 thì 𝑔𝑐𝑑(𝑎 , 𝑏) = 𝑏 Nếu 𝑎 = + 𝑟𝑏𝑞 thì 𝑔𝑐𝑑(𝑎, 𝑏) = 𝑔𝑐𝑑(𝑏, 𝑟)

• Bội chung bé nhất m là bội số chung nhỏ ất của a và b, và mọi bội số chung củnh a a và b đều là bội của m.

𝑚 = 𝑙𝑐𝑚(𝑎, 𝑏) • Với hai số nguyên dương a và b bất kỳ ta có quan hệ

𝑙𝑐𝑚 𝑎, 𝑏 . gcd 𝑎, 𝑏 = 𝑎. 𝑏( ) ( )1.2 Đồng dư v

1.2 Đồng dư và phươà phươà phương trình đồng dư tuyếng trình đồng dư tuyếng trình đồng dư tuyến tínhn tínhn tính

Đồng dư theo modular: nghiên cứu về các phép toán và tính chất của các số dư khi chia cho một số nguyên dương nào đó, như định lý số dư Trung Hoa, phương trình đồng dư tuyến tính, phương trình đồng dư bậc hai, thặng dư thu gọn, phần tử nguyên thủy, thuật toán Diffie Hellman, thuật toán ElGamal, v.v.-

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

Đồng dưĐồng dư

• Cho số nguyên dương a và mộ ốt s nguyên n, n u phép chia a cho n có kế ết quả là r, thì ta nói đồng dư modulo n và ký hiệu là 𝑎 ≡ 𝑏 (𝑚𝑜𝑑 ) 𝑛Ví dụ: 17 ≡ 3 (𝑚𝑜𝑑 ), ℎ𝑎𝑦 17 7 𝑐ℎ 𝑐ℎ𝑜 3 𝑑ư 7𝑖𝑎

• Hai số nguyên thuộc cùng một lớp tương đương khi và chỉ khi chúng cho cùng một số dư nếu chia cho n.

Ví dụ: 68 và 39 là những số cùng lớp vì khi chia cho 29 đều dư 10. • Mỗi lớp tương đương được đại diện bởi một số duy nhất trong tập hợp:

𝑍<sub>𝑛</sub>= {0, 1, 2, 3, . . . . , 𝑛 − 1} là số dư chung khi chia cácsố trong lớp đó cho n.

𝑍<sub>25</sub>= {0, 1, 2, 3, . . . . , 24}

• Cho 𝑎 ∈ 𝑍𝑛. M t s nguyên ộ ố 𝑥 ∈ 𝑍𝑛 được gọi là nghịch đảo của a theo mod n , nếu

𝑎. 𝑥 ≡ 1 (𝑚𝑜𝑑 𝑛).Ví d : a = 2 và x = 3 v i n = 5 vì ụ ớ 2.3 ≡ 1 (𝑚𝑜𝑑 5) • Nếu có số x như vậy thì ta nói a là khả nghịch, và ký hiệu:

𝑥 𝑙à 𝑎<small>−1</small>𝑚𝑜𝑑 𝑛Phương trình đ

Phương trình đồng dư tuyồng dư tuyồng dư tuyến tínhến tínhến tính

Phương trình đồng dư tuyến tính có dạng 𝑎𝑥 ≡ 𝑏 (𝑚𝑜𝑑 ). 𝑛 Trong đó a, b, n là các số nguyên, n > 0, x là ẩn số Hệ phương trình đồng dư tuyến tính

Cho k số nguyên dương đôi một nguyên tố cùng nhau 𝑛 , 𝑛 , … , 𝑛<small>12𝑘 </small>

và 𝑎<sub>1</sub>, 𝑎<sub>2</sub>, … , 𝑎<sub>𝑘</sub> là k số nguyên tuỳ ý. Khi đó ta có hệ phương trình đồng dư tuyến tính

𝑥 ≡ 𝑎1 (𝑚𝑜𝑑 𝑛<sub>1</sub>)𝑥 ≡ 𝑎 (<sub>2</sub> 𝑚𝑜𝑑 𝑛 )<small>2</small>

…𝑥 ≡ 𝑎 (<sub>𝑘</sub> 𝑚𝑜𝑑 𝑛<sub>𝑘</sub>)Có nghiệm duy nhất modulo 𝑛 . 𝑛 . … . 𝑛<small>12𝑘 </small>Chứng minh định lý:

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

• Chứng minh sự duy nhất: Giả sử có hai nghiệm x, y dẫn đến 𝑥 ≡ 𝑦 (𝑚𝑜𝑑 𝑛 , ∀ 𝑖 = 1,2, … , 𝑘<small>𝑖</small>)

Vì 𝑛 , 𝑛 , … , 𝑛<small>12𝑘</small>đơi một ngun t cùng nhau nên ố 𝑥 ≡ 𝑦 (𝑚𝑜𝑑 𝑛<small>1</small>. 𝑛 . … . 𝑛<sub>2</sub> <sub>𝑘</sub>). Tức x và y cùng thuộc lớp thặng dư 𝑛 . 𝑛 . … . 𝑛<small>12𝑘 </small>

• Chứng minh sự tồn tại: Ta muốn viết các nghiệm như là một tổ hợp tuyến tính của các số 𝑎 , 𝑎 , … , 𝑎<small>12𝑘</small>. Chẳng hạn như 𝑥 = 𝐴1𝑎1+ 𝐴<small>2𝑎2</small>+ ⋯ +𝐴 𝑎<small>𝑘 𝑘</small>

Với các 𝐴𝑖 thoả mãn 𝐴𝑗≡ 0 (𝑚𝑜𝑑 𝑛<small>𝑖) ∀, 𝑖 ≠ 𝑗 𝑣à 𝐴𝑖</small>≡ 1 (𝑚𝑜𝑑 𝑛<small>𝑖</small>) Th

Thặng dưặng dưặng dư thu gọn và thu gọn và thu gọn và phần tử nguyên th phần tử nguyên thuỷ phần tử nguyên thuỷuỷ

• Tập 𝒁𝒏 = { 0,1,2, … , − 1} thường được gọi là tập các thặng dư đầy đủ theo 𝑛mod n, vì mọi số ngun bất kỳ đều có thể tìm được trong Zn một số đồng dư với mình (theo 𝑚𝑜𝑑 𝑛 )

• Tập 𝒁𝒏 là đóng đối với các phép tính cộng, trừ và nhân theo 𝑚𝑜𝑑 𝑛, nhưng khơng đóng đối với phép chia, vì phép chia cho theo 𝑎 𝑚𝑜𝑑 𝑛 chỉ có thể thực hiện được khi và nguyên tố với nhau, tức khi gcd( , ) = 1.𝑎 𝑛 𝑎 𝑛

Thặng dư thu gọn

- Tập các thặng dư thu gọn theo 𝑚𝑜𝑑 𝑛 được định nghĩa là tập 𝑍𝑛 <small>∗</small> = { 𝑎 ∈ 𝒁𝒏: gcd(𝑎 , 𝑛) = 1} , tức 𝒁<small>𝒏 ∗</small> là tập con của 𝒁<small>𝒏 bao gồm tất cả các phần tử nguyên tố với n. </small>Vd :

• Tập thặng dư của mod 10 là Z ={1,2,3,4,5,6,7,8,9,11,12,13,14,15}. Trong đó <small>10</small>tập thặng dư thu gọn là tập các số thuộc Z nguyên tố với 10 : Z * = <small>10</small>{1,3,7,9,11,13}

• Số ần tử của tập là { (10) = 6} được gọi là cấph 𝜑 p 𝜑(𝑛) của nhóm. ần tử nguyên thủyPh

- Nếu 𝑝 là một số nguyên tố thì 𝒁𝒑 <small>∗</small> = {1,2, … , − 1}. Và khi đó 𝑝 ∀ 𝑏 ∈ 𝑍𝑝 ∗ ∶ 𝑏<small>𝑝−1</small> ≡ 1(𝑚𝑜𝑑 ) 𝑝

- Một phần tử 𝑔 ∈ 𝒁𝒏 ∗ có cấp 𝑚, nếu m là số nguyên dương bé nhất sao cho 𝑔<small>𝑚</small>≡ 1(mod p) trong 𝒁n

Vd : Cho Z<small>10</small><sup>* </sup>= {1,3,7,9,11,13}, cấp của 7 là 3 vì 7 = 21 ≡ 1 mod (10) hay 21 đồng dư <sup>3</sup>với 1 modulo 10

- Nếu 𝑏 có cấp 𝑝 − 1, tức 𝑝 − 1 là số mũ bé nhất thoả mãn công thức trên, thì các phần tử 𝑏, 𝑏 , … . , <small>2</small> 𝑏<small>𝑃−1</small> đều khác nhau và theo 𝑚𝑜𝑑 𝑝, chúng lập thành 𝒁<small>𝒑 là ∗</small>một nhóm cyclic ( nhóm được cấu thành từ các phần tử là lũy thừa của b ) và 𝑏là một phần tử sinh, hay phần tử nguyên thuỷ của nhóm.

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Vd : 7 là phần tử nguyên thủy của nhóm Z = {7 , 7<small>3</small> } 1.3 Phương t

1.3 Phương trình đồng dư bậc hai và rình đồng dư bậc hai và rình đồng dư bậc hai và thặng dư bậc haithặng dư bậc haithặng dư bậc hai • Phương trình đồng dư bậc hai có dạng: 𝑥𝑥𝑥𝑥𝑥<small>2</small> ≡ 𝑎𝑎𝑎𝑎(𝑚𝑜𝑑𝑚𝑜𝑑 𝑛𝑚𝑜𝑑𝑛𝑛)

Trong đó n là một số nguyên dương, a là số nguyên với gcd(a,n) = 1, và x là ẩn số. • Nếu phương trình có nghiệm thì a là thặng dư bậc 2 (mod n)

• Nếu phương trình vơ nghiệm thì a là bất thặng dư bậc 2 (mod n)

Điều này được thực hiện bằng cách thử các giá trị của 𝑥 từ 0 đến n – 1 và kiểm tra xem giá trị nào thỏa mãn phương trình 𝑥𝑥𝑥𝑥𝑥<small>2</small>≡ 𝑎𝑎𝑎𝑎(𝑚𝑜𝑑𝑚𝑜𝑑𝑚𝑜𝑑 𝑛𝑛) 𝑛

Ví dụ, nếu muốn kiểm tra xem 7 có phải là thặng dư bậc hai modulo 11 hay khơng, ta sẽ xem xét phương trình ≡ 7(𝑥<small>2</small> 𝑚𝑜𝑑 11)

Bằng cách thử các giá trị x từ 0 đến 10: 0<small>2</small> ≡ 0(𝑚𝑜𝑑 11) 1<small>2</small> ≡ 1(𝑚𝑜𝑑 11) 2<small>2</small> ≡ 4(𝑚𝑜𝑑 11) 3<small>2</small> ≡ 9(𝑚𝑜𝑑 11) 4<small>2</small> ≡ 5(𝑚𝑜𝑑 11) 5<small>2</small> ≡ 3(𝑚𝑜𝑑 11) 6<small>2</small> ≡ 3(𝑚𝑜𝑑 11) 7<small>2</small> ≡ 5(𝑚𝑜𝑑 11) 8<small>2</small> ≡ 9(𝑚𝑜𝑑 11) 9<small>2</small> ≡ 4(𝑚𝑜𝑑 11) 10<small>2</small> ≡ 1(𝑚𝑜𝑑11)

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

Ta thấy rằng khơng có số ngun nào trong khoảng từ 0 đến 10 thỏa mãn phương trình 𝑥≡ 7(𝑚𝑜𝑑 11). Do đó 7 khơng phải là thặng dư bậc 2 modulo 11.

• Tập các số nguyên nguyên tố với 𝑛 ợc phân hoạch thành hai tập con: tậđư p 𝑄𝑛 các thặng dư bậc hai 𝑚𝑜𝑑 𝑛 , và tập Qn các bất thặng dư mod n

• Tiêu chuẩn Euler: Số a là thặng dư bậc hai (mod p) nếu và chỉ nếu <small>2−p</small>

a 1(mod )p • Ký hiệu Legendre: p là một số nguyên tố lẻ, a 0 , ký hiệu

paLegendre được định nghĩa như sau:

= {

0 𝑘ℎ𝑖 𝑎 0 (𝑚𝑜𝑑 𝑝)1, 𝑘ℎ𝑖 𝑎 Q<small>p</small>− 1, 𝑘ℎ𝑖 𝑎 Q<small>p</small>• a là thặng dư bậc hai modp khi và chỉ khi 1

• Với mọi a 0, ta có: a<small>2</small>(modp)p

<small>n</small>pppn <small>1</small>. <small>2</small>...

<small>21</small>=thì:

<small>21</small>• Tính chất:

o Nếu m =<small>1</small> m<small>2</small><sup>(mod</sup>n<sup>)</sup>thì <sup>=</sup> <sup>n</sup>mn

{<sup>1 𝑘ℎ𝑖 </sup> <sup>n</sup> <sup>1</sup><sup>(𝑚𝑜𝑑 8)</sup>− 1 𝑘ℎ𝑖 n 3(𝑚𝑜𝑑 8)

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

o =nmnmn

o Nếu m và n đều là số lẻ thì:

, 𝑘ℎ𝑖 m 3(𝑚𝑜𝑑 4) 𝑣à n 3(𝑚𝑜𝑑 4) n

, 𝑘ℎ𝑖 m1(𝑚𝑜𝑑 4) n 3(𝑚𝑜𝑑 4)

1.4 Xác suất v

1.4 Xác suất và thuậà thuậà thuật toán xt toán xt toán xác suấác suấác suấttttt

Trong phần này ta nghiên cứu về các khái niệm và công thức liên quan đến xác suất, như khơng gian mẫu, biến cố, phép tốn xác suất, xác suất có điều kiện, độc lập xác suất, biến ngẫu nhiên, phân phối xác suất, kỳ vọng, phương sai, định lý giới hạn trung tâm, thuật toán Monte Carlo, v.v.

- Biến cố: là một kết quả có thể xảy ra trong một phép thử ẫu nhiên. Biến cố ngcó thể là đơn, hợp, phụ thuộc, độc lập, ....

- Không gian mẫu: là tập hợp tất cả các kết quả có thể xảy ra trong một phép thử ngẫu nhiên. Kí hiệu Ω = { 1, 2 … 𝑠 𝑠 𝑠𝑛}

- Biến ngẫu nhiên: là một hàm số gán một giá trị số cho mỗi kết quả trong không gian mẫu. Biến ngẫu nhiên có thể là rời rạc hoặc liên tục, tùy thuộc vào giá trị số có thể ận được là hữu hạn hay vô hạnh n.

- Phân phối xác suất: là một quy tắc cho biết xác suất của mỗi giá trị hoặc khoảng giá trị của một biến ngẫu nhiên. Phân phối xác suất có thể được biểu diễn bằng bảng, công thức, đồ thị hoặc hàm mật độ xác suất. Có nhiều phân phối xác suất thống kê cơ bản, như phân phối nhị thức, phân phối chuẩn, phân phối Poisson,...Phân bố xác suất 𝑃 trên Ω được định nghĩa là một tập các số ực không âm th 𝑃= { 1, 2, … , 𝑝 𝑝 𝑝𝑛} có tổng ∑ = 1.𝑝𝑖

Xác suất có điều kiện: là khả năng xảy ra của một biến cố A khi biết một biến cố B khác đã xảy ra. Xác suất có điều kiện được ký hiệu là P(A|B) và được tính theo cơng thức:

P(A B)=P(A∣ ∩B)/P(B)

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Trong công thức trên, P(A ∩ B) là xác suất hợp của A và B, tức là xác suất của hai biến cố cùng xảy ra. P(B) là xác suất của biến cố B. Xác suất có điều kiện có thể được hiểu như là xác suất của A trong không gian mẫu mới, đã được thu hẹp lại bởi sự xảy ra của B.

II. CÁC HỆ MẬT CỔ ĐIỂN

2.1 Hệ mật mã

2.1 Hệ mật mã CaeserCaeser Caeser

2.1.1

2.1.1 ới thiGiới thiệệệệệới thiu:u:

H mệ ật mã Caeser còn được g i là M t mã d ch chuy n, là m t trong nh ng h ọ ậ ị ể ộ ữ ệmật mã cổ điển đơn giản nhất và được biết đến nhi u nh t trong l ch sề ấ ị ử. Nó hoạt động bằng cách d ch chuy n m i ký t ị ể ỗ ự trong thông điệp một kho ng c nh theo b ng ch cái. ả ố đị ả ữ

Trong l ch s , m t mã cị ử ậ ộng hưởng được g i là m t mã d ch chuy n. Julius Caeser ọ ậ ị ểđã sử dụng một hệ mật mã cộng để liên lạc với các sĩ quan của mình. Vì lý do này, các hệ mật mã cộng đôi khi được g i là mọ ật mã Caeser, Caeser đã sử d ng mụ ột khóa d ch chuyị ển là 3 cho các thơng điệp của mình.

2.1.2 Ngun lý

2.1.2 Ngun lý hoạt độ hoạt độ hoạt độngngng

Để ự th c hiện được mã hóa Caeser, trước tiên ta cần ánh xạ các ký t trong bảng thành ựcác ch cái Latinh thành các sữ ố tương ứng từ 00 25-

Plaintext and Ciphertex in Z<sub>26</sub>Sau đó ta thự ện quá trình mã hóa theo sơ đồ hi sau:

Ở đây, khóa klà m t s nguyên có giá tr thu c tộ ố ị ộ ập Z<sub>26</sub> =0,1,2,...,25VD: Mã hóa bản tin P = “NGUYENANHTUAN” bằng m t mã c ng v i khóa ậ ộ ớ k 5

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

N → 13 Encryption: (13 + 05) mod 26 = 18 → S G → 06 Encryption: (06 + 05) mod 26 = 11 → L U → 20 Encryption: (20 + 05) mod 26 = 25 → Z Y → 24 Encryption: (24 + 05) mod 26 = 03 → D E → 04 Encryption: (04 + 05) mod 26 = 09 → J N → 13 Encryption: (13 + 05) mod 26 = 18 → SA → 00 Encryption: (00 + 05) mod 26 = 05 → F N → 13 Encryption: (13 + 05) mod 26 = 18 → S H → 07 Encryption: (07 + 05) mod 26 = 12 → M T → 19 Encryption: (19 + 05) mod 26 = 24 → Y U → 20 Encryption: (20 + 05) mod 26 = 25 → Z A → 00 Encryption: (00 + 05) mod 26 = 05 → F N → 13 Encryption: (13 + 05) mod 26 = 18 → S

C = “SLZDJSFSMYZFS”

Để giải mã, ta th c hiự ện theo sơ đồ sau:

Trong công th c này, ứ klà ph n t nghầ ừ ịch đảo c ng cộ ủa k trong tập Z<sub>26</sub>: 0

26mod))(

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

L → 11 Dencryption: (11 + 21) mod 26 = 06 → G Z → 25 Dencryption: (25 + 21) mod 26 = 20 → U D → 03 Dencryption: (03 + 21) mod 26 = 24 → Y J → 09 Dencryption: (09 + 21) mod 26 = 04 → E S → 18 Dencryption: (18 + 21) mod 26 = 13 → N F → 05 Dencryption: (05 + 21) mod 26 = 00 → A S → 18 Dencryption: (18 + 21) mod 26 = 13 → N M → 12 Dencryption: (12 + 21) mod 26 = 07 → H Y → 24 Dencryption: (24 + 21) mod 26 = 19 → T Z → 25 Dencryption: (25 + 21) mod 26 = 20 → U F → 05 Dencryption: (05 + 21) mod 26 = 00 → A S → 18 Dencryption: (18 + 21) mod 26 = 13 → N

P = “NGUYENANHTUAN” 2.1.3 Mô

2.1.3 Mô phỏ phỏ phỏngng ngMã hóa

defcaesar_cipher_encrypt(text shift, ): result =""

forchar intext: ifchar.isalpha():

shifted =ord(char) -ord('A') shifted (= shifted +shift) %26

encrypted_char =chr(shifted +ord('A')) result+=encrypted_char

else:

result+=char

returnresult

plaintext ="NGUYENANHTUAN"shift_amount =5

encrypted_text =caesar_cipher_encrypt(plaintext shift_amount, )

print("Mã hóa Caesar:", encrypted_text)

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

decrypted_char =chr((x -shift) %26+ord('a')) result+=decrypted_char

else:

x=ord(char) -ord('A')

decrypted_char =chr((x -shift) %26+ord('A')) result+=decrypted_char

else:

result+=char

returnresult

ciphertext ="SLZDJSFSMYZFS"for iinrange(26):

decrypted_text =caesar_cipher_decrypt(ciphertext i, ) print("Key = { }i : decrypted_text}")

2.2 Hệ mật AFFI2.2 Hệ mật AFFINENE NE2.2.1

2.2.1 ới thiệuGiới thiệu

M t mã Affine là m t d ng m t mã thay th dùng m t b ng chậ ộ ạ ậ ế ộ ả ữ cái, trong đó mỗi chữ cái được ánh xạ tới một số, sau đó được mã hóa thơng qua một hàm bậc nhất có dạng y=ax+b.

2.2.2 Nguyên

2.2.2 Nguyên lý hoạt độ lý hoạt độ lý hoạt độngngng

Để thực hi n m t mã hóa Affine, ệ ậ trước tiên ta c n ánh x các kí t trong b ng ch ầ ạ ự ả ữcái Latinh thành các số tương ứng t 00 - 25. ừ

Plaintext and Ciphertex in Z<sub>26</sub>

Sau đó, thực hiện quá trình mã hóa theo sơ đồ sau:

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Trong cơng th c này, 2 khóa ứ a và blà 2 s nguyên thu c tố ộ ập Z<sub>26</sub>, trong đó a và 26 là hai s nguyên t cùng nhau hay ố ố gcd(,a26) 1=

VD: Mã hóa bản tin P = “NGUYENANHTUAN” bằng m t mã Affine v i khóa ậ ớ =17và b 5

N → 13 Encryption: (17.13 + 05) mod 26 = 18 → S G → 06 Encryption: (17.06 + 05) mod 26 = 03 → DU → 20 Encryption: (17.20 + 05) mod 26 = 07 → H Y → 24 Encryption: (17.24 + 05) mod 26 = 23 → Y E → 04 Encryption: (17.04 + 05) mod 26 = 21 → V N → 13 Encryption: (17.13 + 05) mod 26 = 18 → S A → 00 Encryption: (17.00 + 05) mod 26 = 05 → F N → 13 Encryption: (17.13 + 05) mod 26 = 18 → S H → 07 Encryption: (17.07 + 05) mod 26 = 20 → UT → 19 Encryption: (17.19 + 05) mod 26 = 16 → Q U → 20 Encryption: (17.20 + 05) mod 26 = 07 → H A → 00 Encryption: (17.00 + 05) mod 26 = 05 → F N → 13 Encryption: (17.13 + 05) mod 26 = 18 → S

C = “SDHYVSFSUQHFS”

Để giải mã, ta th c hiự ện theo sơ đồ sau:

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Ở đây, a<small>1</small> là ph n t nghầ ử ịch đảo nhân của avà blà ph n t nghầ ử ịch đảo c ng ộcủa btrong tập Z<sub>26</sub>: a.<small>−</small> mod<small>1</small> 26 1= và (b+ b(−))mod26 =0

Mật mã c ng là mộ ột trường hợp đặc bi t c a m t mã Affine vệ ủ ậ ới a 1Mật mã nhân là một trường hợp đặc bi t c a m t mã Affine vệ ủ ậ ới b 0

VD: Gi i s ả ử thu được ciphertext như ví dụ ở trên, bi t khóa ế =10 và b 5. Tìm plaintext?

Y → 23 Dencryption: 23(23+21) mod 26 = 24 → YV → 21 Dencryption: 23(21+21) mod 26 = 04 → E

P = “NGUYENANHTUAN”

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

2.2.3 Mô2.2.3 Mô phỏ phỏ phỏngng ngMã hóa

defaffine_cipher_encrypt(plaintext, a, ): result =""

forchar inplaintext: ifchar.isalpha(): ifchar.islower(): x=ord(char) -ord('a')

encrypted_char =chr(((a * +b) %26) ord('a')) result+=encrypted_char

else:

x=ord(char) -ord('A')

encrypted_char =chr(((a * +b) %26) ord('A')) result+=encrypted_char

else:

result+=char

returnresult

plaintext ="NGUYENANHTUAN"a =17

b =5

encrypted_text =affine_cipher_encrypt(plaintext, a, )

print("Mã hóa Affine:", encrypted_text)

Giải mã

defmod_inverse(a, m): for iinrange(m): ( if a*i) %m== : 1

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

forchar inciphertext: ifchar.isalpha(): ifchar.islower(): x=ord(char) -ord('a')

decrypted_char =chr(((a_inv ( )) * x-b %26) ord('a')) result+=decrypted_char

else:

x=ord(char) -ord('A')

decrypted_char =chr(((a_inv ( )) * x-b %26) ord('A')) result+=decrypted_char

else:

result+=char

returnresult

ciphertext ="SDHYVSFSUQHFS"a =17

b =5

decrypted_text =affine_cipher_decrypt(ciphertext, a, )

print("Giải mã Affine:", decrypted_text)

2.3 Hệ mật H2.3 Hệ mật HILLILL2.3.1 Lịch

2.3.1 Lịch sử hình thành sử hình thành và phát tri sử hình thành và phát tri và phát triển :ển :ển :

Mật mã Hill được phát minh vào năm 1929 bởi Lester S. Hill. Đây là mật mã đa đồ họa đầu tiên trong đó việc thực tế là có thể ạt động nhiều hơn 3 ký tự một lúc. hoMật mã Hill sử dụng modulo, nhân ma trận và nghịch đảo ma trận. Do đó, nó là mật mã thiên về toán học nhiều hơn các loại mật mã khác.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

Det(A) 0 và Det(A) khả nghịch trên Z thì gcd[ det(A),26 ] = 1 thì khi đó <small>26 </small>ma trận A khả nghịch trên Z26

- Vì ma trận A khả nghịch trên Z nên tồn tại 1 ma trận nghịch đả của A trên <small>26 </small> o Z26 là A<small>-1 </small>

- Có 2 cách tìm ma trận nghịch đảo đã được học là : • Sử dụng phần phụ đại số :

B1 : Tính det(A). Nếu det(A) = 0 thì khơng có ma trận nghịch đảo. Nếu det(A) 0 thì có ma trận nghịch đảo.

B2 : Lập ma trận chuyển vị A’ ( các hàng của A chuyển thành các cột của A )

B3 : Lập ma trận phụ hợp của A’ : P = (A’ ) với A’ là phần bù đại số <small>Aij nmij</small>của phần tử ở hàng i, cột j

B4 : Tính ma trận nghịch đảo theo cơng thức :

c a−=

−• Sử dụng Gauss – Jordan : ít khi dùng trong mật mã Hill b, Định nghĩa và cách dùng mật mã Hill :

Mật mã Hill là hệ mật trong đó P = C = (Z<small>26 )m</small> và K với P là tập các ma trận m x m biểu diễn plain text, C là tập các ma trận m x m biểu diễn cipher text, K là tập ác ma trận m x m khả nghịch trên Z26.

Với mỗi ma trận k K, p ={p p<sub>1</sub>, ,...,<sub>2</sub> <sub>m</sub>p} P; c={c ,c ,...,c }<sub>1</sub> <sub>2</sub> <sub>m</sub> CNếu các p và c ở dạng ma trận cột xác định :

o Hàm mã hóa : e (p) = K.p<small>K</small>o Hàm giải mã : d (p) = K<small>-1</small>.c

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

Nếu các p và c ở dạng ma trận hàng xác định : o Hàm mã hóa : e (p) = p.K<small>K</small>

Cho đoạn văn bản rõ plain text là : P = NGUYENMINHPHUC. a. Mã hóa đoạn văn bản trên bằng mật mã Hill với khóa key là K = HILL b. Giải đoạn mã thu được ở câu a

Bài làm : a. Mã hóa

Khóa K được viết dưới dạng ma trận vng cấp 2 là : 7 8

11 11H I

KL L

2Up

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

KL L

Ta có det(K)mod26 = (11.7 – 8.11) = (-11)mod26 = 15; Trên vành Z ta có (det(K)) = 7 vì 15.7 = 105 = 1mod26<small>26</small> <sup>-1 </sup>

Vì gcd( det(K), 26) = gcd (15, 26) = 1 nên K khả nghịch trên vành Z26

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

2.4.1 ới thiệuGiới thiệu

Mật mã Playfair là một phương pháp mã hóa chữ cái được sử dụng trong lĩnh vực mật mã học, được phát triển bởi Charles Wheatstone vào năm 1854 và được Lionel S. Playfair chế tạo lại, từ đó mang tên củ ông. Đây là một hệ ống mật mã a thsử dụng một bảng chữ cái, thường là một ma trận 5x5, được tạo ra từ một từ khóa chọn lọc.

Mật mã Playfair được sử dụng trong quá khứ cho mục đích thương mại và quân sự. Tuy nhiên, do một số hạn chế như khả năng bị ải mã dễ dàng nếu có thơng gitin về từ khóa, nó đã được thay thế bởi các phương pháp mã hóa mạnh mẽ hơn trong thời kỳ ện đại. Đây vẫn là một phương pháp mã hóa thú vị và có giá trị hitrong việc hiểu cơ bản về lịch sử của mật mã.

2.4.2 Nguyên lý

2.4.2 Nguyên lý hoạt độ hoạt độ hoạt độngngng a. Chuẩn bị

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

❖ Ma trận mã hỗ

• Cần tạo một ma trận 5x5 chứa các chữ cái khơng trùng lặp.

• Bắt đầu bảng với các chữ cái của khóa key (loại bỏ ữ trùng) và sau đó điềch n các chữ cái cịn lại theo thứ tự.

• Lưu ý: Bảng chữ cái Tiếng Anh có 26 chữ cái, mà ở đây chỉ có 25, nên thường thì ta sẽ cho 2 chữ i và j vào cùng một chỗ

Ví dụ: Key = committee

a – – – b c d – – e f – – g h – – i j – – k l – – – – m n o p q – – – – – r s t u – v – – w x – – y z

❖ Chọn cặp chữ cái từ văn bản cần mã hố Plaintext

• Nếu thừa ra 1 chữ cái sau khi nhóm thì cũng có thể ghép cặp chữ đó với 1 chữ cái bất kì

• Nếu cặp chữ trùng nhau: Thêm một chữ "dummy" như "X" giữa chúng và sau đó giải mã như bình thường

Ví dụ: Plaintext = communication → co mx mu ni ca ti on

b. Quy tắc mã hố Playfair

• Nếu cặp chữ cùng nằm trong cùng một hàng hoặc cột: Di chuyển theo hàng hoặc cột sang chữ cái kế tiếp theo chiều tương ứng để ải mã.gi

• Nếu cặp chữ cách nhau: Tạo một hình chữ ật bằng cách lấy hai chữ cái ở nhđối diện của hình chữ nhật.

• Lưu ý: Giữ nguyên khoảng cách và dấu câu khi giải mã. 1. Ví dụ

• Mã hỗ bằng mật mã Playfair. Cho Plaintext = hellooneandall và Key = thedieis a – – – – – – – b c d e f g h – i – j – k – – – l m n – – – – – – – – o p q r s t u v – – – w x y – z

Ta có, ma trận mã hố là:

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

2.4.3 Lập trình mơ phỏh mơ phỏh mô phỏngngng # Tạo ma trận key kích thước 5x5

# Function to generate the Playfair matrix

alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ" key = key.upper().replace("J" "I", )

key = ''.join(dict.fromkeys(key)) matrix = []

forchar in key: ifchar not in matrix: matrix.append(char) forchar in alphabet: ifchar not in matrix: matrix.append(char)

playfair_matrix = [matrix[i:i+5] fori inrange(0, len(matrix), 5)] return playfair_matrix

# Tìm vị trí của chữ cái

# Function to get the position of a character in the matrix

forj inrange(5): matrix[i][j] == char: if return i, j # Thực hiện mã hoá

# Function to encrypt plaintext using Playfair cipher

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

plaintext = plaintext.upper().replace("J" "I", ) iflen(plaintext) % != : 2 0

plaintext += 'X'

playfair_matrix = generate_playfair_matrix(key) ciphertext = []

char1, char2 = plaintext[i], '' i + if 1< len(plaintext): char2 = plaintext[i + ] 1

row1, col1 = get_char_position(playfair_matrix, char1) row2, col2 = get_char_position(playfair_matrix, char2) row1 == row2: if

ciphertext.append(playfair_matrix[row1][(col1 + ) % 1 5]) ciphertext.append(playfair_matrix[row2][(col2 + ) % 1 5]) elif col1 == col2:

ciphertext.append(playfair_matrix[(row1 + ) % ][col1]) 1 5

ciphertext.append(playfair_matrix[(row2 + ) % ][col2]) 1 5

else:

ciphertext.append(playfair_matrix[row1][col2]) ciphertext.append(playfair_matrix[row2][col1]) return .join(ciphertext) ''

# Thực hiện giải mã

# Function to decrypt ciphertext using Playfair cipher playfair_matrix = generate_playfair_matrix(key) plaintext = []

char1, char2 = ciphertext[i], '' i + if 1< len(ciphertext): char2 = ciphertext[i + ] 1

row1, col1 = get_char_position(playfair_matrix, char1)

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

row2, col2 = get_char_position(playfair_matrix, char2) w1 == row2: ifro

plaintext.append(playfair_matrix[row1][(col1 - ) % 1 5]) plaintext.append(playfair_matrix[row2][(col2 - ) % 1 5]) elif col1 == col2:

plaintext.append(playfair_matrix[(row1 - ) % ][col1]) 1 5

plaintext.append(playfair_matrix[(row2 - ) % ][col2]) 1 5

else:

plaintext.append(playfair_matrix[row1][col2]) plaintext.append(playfair_matrix[row2][col1]) return .join(plaintext) ''

# Ví dụ key = "SOCOLA"plaintext = "CHOCOPIE"

# Encryption

ciphertext = playfair_encrypt(plaintext, key)

# Decryption

decrypted_text = playfair_decrypt(ciphertext, key)

OUTPUT:

Plaintext: CHOCOPIE Encrypted: SKCLSQKD Decrypted: CHOCOPIE

2.5 Hệ mật vig2.5 Hệ mật vignerenerenere

Mật mã Vigenère là một phương pháp mã hóa văn bản cổ điển hoạt động bằng cách s d ng xen k mử ụ ẽ ột số phép mã hóa Caesar khác nhau d a trên các ch ự ữ

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

cái c a m t t khóa. Nó là m t dủ ộ ừ ộ ạng đơn giản c a m t mã thay th dùng nhiủ ậ ế ều bảng ch cái. ữ

2.5.1 Lịch

2.5.1 Lịch sử hình t sử hình thành sử hình thành hành

Mã hóa Vigenère được đặt tên theo nhà mật mã học người Pháp Blaise de Vigenère, người được coi là người đầu tiên giới thiệu phương pháp này. Mã hóa Vigenère đã xuất hiện vào khoảng năm 1553 và được đăng trong tác phẩm của Vigenère có tựa đề "Traité des chiffres" (Quy n sách v ể ề mã hóa). Tuy nhiên, đã có một số đóng góp trước đó của các nhà m t mã hậ ọc khác như Giovan Battista Bellaso, người Ý, đã mô tả một phương pháp tương tự vào năm 1553 trong tác phẩm "La cifra del. Sig. Giovan Battista Bellaso".

Phương pháp mã hóa Vigenère tạo ra một loại mã hóa polyalphabetic, nơi mỗi ký tự trong văn bản được mã hóa bằng cách sử dụng một trong nhiều bảng chữ cái khác nhau, d a vào vị trí của ký t trong khóa. Điều này làm cho việc giải ự ựmã trở nên khó khăn hơn so với các phương pháp mã hóa monoalphabetic như Caesar cipher.

Mã Vigenère đã được sử dụng rộng rãi trong quân s và truy n tin tình báo ự ềtrong m t th i gian dài vì nó t o ra m t mộ ờ ạ ộ ức độ độc đáo của tính an tồn so với các phương pháp mã hóa trước đó. Tuy nhiên, sau này, khi các phương pháp giải mã được phát triển, mã hóa Vigenère đã trở nên dễ b phá v , và các h ị ỡ ệ thống mã hóa m nh m ạ ẽ hơn đã thay thế nó trong nhiều ứng d ng. ụ

2.5.2 Mô tả thuậ

2.5.2 Mơ tả thuật tốn mã hóa t tốn mã hóa t tốn mã hóa

Mã Vignere mã hóa b ng cách sằ ử dụng m t b ng hình vng g m có 26 ộ ả ồhàng. M i hàng d ch v bên trái mỗ ị ề ột bước so với hàng bên trên để ạ t o thành 26 bảng mã Caesar. Trong q trình mã hóa tùy vào t khóa mà m i thừ ỗ ời điểm ta dùng một dịng khác nhau để mã hóa văn bản.

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

Ví d : ụ

Ta có plaintext: HELLO WORLD và key: MAHOA Bước 1: Điền Keyword dưới chuỗi plaintext và tái diễn ta có:

Hàng 1: H E L L O W O R L D Hagn 2: M A H O A M A H O A

Bước 2: Lấy một ký tự hàng 2 ng v i một ký t hàng 1 và d a vào bảng mã ở ứ ớ ự ở ựhóa để tìm ra ký tự mã hóa tương ứng.

H – M (c t H, hàng M) => T ộE – A (c t E, hàng A) => E ộL – H (c t L, hàng H) => S ộL – O (c t L, hàng O) => Z ộO – A (c t O, hàng A) => O ộW – M (c t W, hàng M) => I ộO – A (c t O, hàng A) => O ộR – H (c t R, hàng H) => Y ộL – O (c t L, hàng O) => Z ộH – M (c t H, hàng M) => D ộK t qu : Ciphertext: TESZOIOYZD ế ả2.5.3 MôMô ph phph ngỏỏỏỏỏ ng

def generate_key(message, key): key = list(key)

key_length = len(key)

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

if len(message) == key_length: return key

else:

for i in range(len(message) - key_length): key.append(key[i % key_length]) return ''.join(key)

def vigenere_encrypt(message, key):

key = generate_key(message, key) # S dử ụng hàm generate_key để ạ t o khóa encrypted_text = []

for i in range(len(message)): char = message[i] if char.isalpha():

char_index = ord(char.upper()) - ord('A') key_char = key[i]

key_index = ord(key_char.upper()) - ord('A') encrypted_index = (char_index + key_index) % 26 encrypted_char = chr(encrypted_index + ord('A')) if char.islower():

encrypted_char = encrypted_char.lower() encrypted_text.append(encrypted_char) else:

encrypted_text.append(char) return ''.join(encrypted_text)

def vigenere_decrypt(encrypted_message, key): key = generate_key(encrypted_message, key) decrypted_text = []

for i in range(len(encrypted_message)): char = encrypted_message[i] if char.isalpha():

char_index = ord(char.upper()) - ord('A') key_char = key[i]

key_index = ord(key_char.upper()) - ord('A') decrypted_index = (char_index - key_index) % 26 decrypted_char = chr(decrypted_index + ord('A')) if char.islower():

decrypted_char = decrypted_char.lower()

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

decrypted_text.append(decrypted_char) else:

decrypted_text.append(char) return ''.join(decrypted_text) # Ví d s d ng: ụ ử ụ

message = "HELLOWORLD" key = "MAHOA"

# Mã hóa v i mã hóa Vigenère ớ

encrypted_message = vigenere_encrypt(message, key) print(f"Encrypted message: {encrypted_message}") # Gi i mã v i mã hóa Vigenère ả ớ

decrypted_message = vigenere_decrypt(encrypted_message, key) print(f"Decrypted message: {decrypted_message}")

2.6 Hệ mật A2.6 Hệ mật Atbashtbash tbash2.6.1 Lịch

2.6.1 Lịch sử sử sử

Mã Atbash là m t hình thộ ức mã hóa đơn giản, thu c lo monoalphabetic ộ ại substitution cipher. Nó có ngu n g c t ồ ố ừ Israel và được dừng để ả m hóa và gi i mã ảbảng ch cái ti ng Do Thái. Tên cữ ế ủa h m t này th c chệ ậ ự ất được rút g n t Aleph ọ ừTaw Bet Shin, các chữ cái đầu tiên, cu i cùng, th hai và th 2 tố ứ ứ ừ cuối cùng trong bảng ch cái ti ng Do Thái. ữ ế

Vì tính chất đơn giản nên hệ mật này không được sử d ng cho mụ ục đích mã hóa b o m t mà chả ậ ỉ dùng để ngụy trang từ ngũ thông thường cho người đọc ph ổthơng.

2.6.2 Mã

2.6.2 Mã hóa và giải mã hóa và giải mã hóa và giải mã hệ mật Atbash hệ mật Atbash hệ mật Atbash

Đây là một mật mã đơn giản để giải mã. Tất cả những gì bạn cần làm là tạo một b ng d ch vả ị ới các chữ cái trong b ng chả ữ cái được vi t tế ừ A đến Z ở phía trên và đảo ngược ở phía dưới. Tìm ch ữ cái trong văn bản mật mã của bạn ở hàng dưới cùng và nhìn phía trên nó để xem nó đã được giải mã chưa.

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

2.6.3 Một số

2.6.3 Một số ến thể khác củbiến thể khác củến thể khác của mã Atbasha mã Atbash

Atbash dở ạng thơng thường ch mã hóa các ch cái A-ỉ ữ Z, để ạ ố l i s và dấu câu dướ ạng văn bải d n thuần túy. Các dạng biến thể của mật mã tồn tại bao gồm các s và các ký hi u ch m câu phố ệ ấ ổ biến nhất. Điều này tương tự như cách ROT13 đã được mở rộng trong mật mã ROT18 và ROT47.

2.6.4 MôMô ph phph ngỏỏỏỏỏ ng

def atbash_cipher(text): result = ""

for char in text: if char.isalpha(): if char.islower():

# Mã hóa ký t ự chữ cái thường

encoded_char = chr(122 - ord(char) + 97) else:

# Mã hóa ký t ự chữ cái in hoa encoded_char = chr(90 - ord(char) + 65) else:

# Gi nguyên các ký t không ph i chữ ự ả ữ cái encoded_char = char

result += encoded_char return result

plaintext = "Ngay moi tot lanh" encrypted_text = atbash_cipher(plaintext) print("Encrypted:", encrypted_text) # Giải mã văn bản đã mã hóa

decrypted_text = atbash_cipher(encrypted_text) print("Decrypted:", decrypted_text)

</div>

×