Dự án “Mã hóa Caesar”
- Mã hóa Caesar là gì?
Mã hóa là chiêu thức để biến thông tin ( hình ảnh, văn bản ) từ định dạng thông thường sang dạng thông tin mà tất cả chúng ta không hề hiểu được nếu không có phương tiện đi lại giải thuật. Đồng thời, mã hóa có vai trò quan trọng trong thanh toán giao dịch điện tử để bảo vệ độ bảo mật thông tin, toàn vẹn của thông tin khi truyền trên mạng. Thông thường, mã hóa được vận dụng nhiều trong những ví điện tử quen thuộc với tất cả chúng ta như Momo, Zalopay, Shopee Pay …. Trái lại, giải thuật là quy trình ngược của mã hóa, biến thông tin từ dạng được mã hóa về dạng thông tin bắt đầu .
Mật mã Caesar là một dạng mật mã thay thế sửa chữa, trong đó mỗi ký tự ở văn bản khởi đầu sẽ được thay thế sửa chữa bằng một ký tự khác, có vị trí cách nó một khoảng chừng xác lập trong bảng vần âm. Cũng giống như những loại mật mã sửa chữa thay thế khác, mật mã Caesar rất dễ bị phá giải. Tuy nhiên đây là một bài toán hay để tất cả chúng ta vận dụng kỹ năng và kiến thức đã học về “ vòng lặp ” và “ mảng ” ở bài 3 của khóa CS 101. Hãy thử tưởng tượng những bạn muốn kể một câu truyện bí hiểm cho người bạn thân của mình. Để bảo mật thông tin câu truyện riêng tư không bị lộ ra ngoài, tất cả chúng ta cần mã hóa câu truyện và gửi cho bạn mình kèm với giải pháp giải thuật. Cách làm này rất là mê hoặc phải không nào !
Người đã sáng tạo ra cách mã hóa Caesar mê hoặc là vị hoàng đế Julius Caesar. Kỹ thuật này đã được tăng trưởng vào khoảng chừng năm 100 Trước Công nguyên. Hoàng đế Caesar đã dùng nó để gửi những mệnh lệnh quan trọng cho những tướng sĩ trên mặt trận. Do đó, nếu bọn giặc có bắt được người truyền tin thì cũng không hề đọc và hiểu được nội dung của bức thư mã hóa đó. Kiến thức này thật sự rất hữu dụng và được vận dụng cho tới ngày thời điểm ngày hôm nay .
- Kiến thức lập trình:
Một số kiến thức chúng ta đã được học ở bài 3 của khoá CS 101 sẽ được áp dụng để hoàn thành chương trình mã hoá này:
Bạn đang đọc: Dự án “Mã hóa Caesar”
- Mảng và cách lấy phần tử của mảng trong Python.
- Vòng lặp for và while trong Python.
- Câu lệnh input() để nhập dữ liệu trong Python.
- Câu lệnh print() để in thông báo ra màn hình.
- Kiểu dữ liệu boolean trong Python với so sánh ==.
- Bài toán:
Chúng ta sẽ sử dụng Thonny để xây dựng một chương trình vừa giúp mã hoá, vừa giúp giải mã Caesar. Chương trình sẽ cho người dùng nhập một câu muốn mã hoá và số ký tự muốn dịch chuyển trong bảng chữ cái (k). Số k dương sẽ dịch chuyển văn bản sang phải (theo thứ tự từ A sang Z). Số k âm sẽ dịch chuyển văn bản sang trái (theo thứ tự từ Z sang A).
Ví dụ 1:
Văn bản gốc ( Văn bản chưa mã hóa ) : ABCDEF
Văn bản mã hóa : CDEFGHTrong ví dụ trên, các kí tự trong văn bản gốc được mã hóa bằng cách dịch sang phải 2 kí tự. k=2.
Gốc A B C D E F … X Y Z Mã hóa C D E F G H … Z A B Vì được dịch sang phải 2 ký tự nên A được mã hóa thành C, B mã hóa thành D … Đặc biệt, Y được mã hóa thành A, Z được mã hóa thành B, quay lại những ký tự tiên phong .
Ví dụ 2:
Văn bản gốc ( Văn bản chưa mã hóa ) : ABCDEF
Văn bản mã hóa : YZABCDTrong ví dụ trên, các kí tự trong văn bản gốc được mã hóa bằng cách dịch sang trái 2 kí tự. k=-2.
Gốc A B C D E F … X Y Z Mã hóa Y Z A B C D … U V X Vì được dịch sang trái 2 ký tự nên C được mã hóa thành A, D mã hóa thành B … Đặc biệt, A được mã hóa thành Y, B được mã hóa thành Z, quay lại những ký tự ở đầu cuối .
Chúng ta có thể thấy rằng k âm là phương pháp giải mã cho mã hoá với k dương và ngược lại.
Trước khi bắt tay vào lập trình, tất cả chúng ta hoàn toàn có thể thử chương trình để mã hóa và giải thuật Caesar : https://s4v.trinket.io/sites/caesar
- Bắt tay vào lập trình thôi nào!!!
a. Thuật toán
Trước khi bắt tay vào viết code, tất cả chúng ta sẽ cùng tâm lý một thuật toán để xử lý bài toán này nhé. Chúng ta hoàn toàn có thể màn biểu diễn tổng thể những ký tự trong bảng vần âm bằng một mảng trong Python .
arr = ['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']
Mảng arr có 26 phần tử. Với một ký tự bất kỳ, chúng ta có thể tìm được vị trí (index) i của nó trong mảng. Do đó khi dịch chuyển ký tự đó sang phải k kí tự, vị trí mới sẽ là i + k. Nếu dịch chuyển ký tự đó sang trái k kí tự thì khi đó k < 0 nên vị trí mới vẫn sẽ là i + k.
Trong trường hợp chúng ta dịch chuyển qua hai đầu của bảng chữ cái thì sao nhỉ? Ví dụ: Ký tự ‘X’ ở vị trí 23 trong mảng. Khi dịch chuyển sang phải 3 ký tự, vị trí mới sẽ là 23 + 3 = 26. Tuy nhiên vị trí cuối cùng của mảng arr là 25. Do đó, chúng ta phải quay lại vị trí đầu tiên (0) của ký tự ‘A’. Trong trường hợp này, khi dịch chuyển, chúng ta đã đi hết 1 lượt mảng arr. Chúng ta có thể thấy công thức tính vị trí sau khi dịch chuyển là 23 + 3 – 26 * 1 = 0.
Lấy một ví dụ khác: Ký tự ‘X’ ở vị trí 23 trong mảng. Khi dịch chuyển sang trái 80 ký tự, vị trí mới sẽ là 23 – 80 = -57. Từ vị trí ký tự ‘X’, nếu dịch sang trái 23 ký tự, chúng ta sẽ đến vị trí của ký tự ‘A’. Như vậy, chúng ta đã đi hết 1 lượt mảng arr. Từ vị trí ký tự ‘A’, dịch tiếp sang trái 26 ký tự, chúng ta sẽ đi hết một lượt nữa mảng arr và quay lại vị trí ký tự ‘A’. Tiếp tục dịch sang trái 26 ký tự, chúng ta sẽ tiếp tục đi hết một lượt nữa mảng arr và quay lại vị trí ký tự ‘A’. Chúng ta còn phải dịch sang trái 5 ký tự nữa. Như vậy chúng ta sẽ đến vị trí ký tự ‘V’. Tóm lại, chúng ta đã đi hết 3 lượt mảng arr. Chúng ta có thể thấy công thức tính vị trí sau khi dịch chuyển là 23 – 80 + 26 * 3 = 21.
Để tính xem phải đi qua mảng arr bao nhiêu lần, chúng ta có thể sử dụng phép toán floor division trong Python. Floor division trong Python là //. Floor division sẽ trả về số nguyên lớn nhất bé hơn kết quả của phép chia thông thường. Ví dụ: Với phép chia thông thường, chúng ta có 3 / 2 = 1,5. Tuy nhiên với floor division, 3 // 2 = 1, bởi vì 1 là số nguyên lớn nhất bé hơn 1,5. Lấy một ví dụ khác: Với phép chia thông thường, -57 / 26 = -2,19. Tuy nhiên với floor division, -57 // 26 = -3, bởi vì -3 là số nguyên lớn nhất bé hơn -2,19.
Tổng kết lại, nếu chúng ta ở vị trí i trong mảng arr và chúng ta dịch k ký tự, công thức tính vị trí sau khi dịch chuyển là i + k – 26 * ((i + k) // 26).
b. Code:
Bước 1: Viết các câu lệnh khai báo cần thiết
Chúng ta sử dụng câu lệnh input() để hỏi người dùng khi nào muốn dừng trò chơi và vòng lặp while để tiếp tục trò chơi tương tự như trò chơi Nhà thám hiểm và cánh cửa bí mật ở bài 2. Chúng ta cũng tạo mảng arr để lưu bảng chữ cái:
arr = ['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'] tiep = 'y' while tiep == 'y': tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')
Trong vòng lặp while, chúng ta sẽ sử dụng câu lệnh input()để yêu cầu người dùng nhập câu cần mã hóa và số ký tự muốn dịch chuyển. Chúng ta cần tạo biến để lưu chuỗi sau khi được mã hoá:
plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper() jump = int(input("Bạn muốn dịch sang mấy ký tự? ")) t = ''
Để đơn giản, chúng ta sẽ sử dụng câu lệnh .upper() để in hoa tất cả các ký tự trong câu người dùng nhập vào. Code hoàn chỉnh sẽ là:
arr = ['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'] tiep = 'y' while tiep == 'y': plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper() jump = int(input("Bạn muốn dịch sang mấy ký tự? ")) t = '' tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')
Bước 2: Xác định vị trí của ký tự trong mảng arr:
Một câu được biểu diễn bằng kiểu dữ liệu chuỗi (string) trong Python. Chúng ta đã được học ở bài 3, một chuỗi là một mảng mà phần tử là các ký tự trong chuỗi. Ví dụ: chuỗi “STEAM” là một mảng gồm 5 phần tử “S”, “T”, “E”, “A”, “M”. Như vậy để lấy các ký tự từ chuỗi, chúng ta có thể sử dụng vòng lặp for:
for character in plaintext: print(character)
Chúng ta có thể sử dụng câu lệnh print để debug. Trong vòng lặp for, để lấy ra vị trí của ký tự ở trong mảng arr, chúng ta sử dụng thêm vòng lặp while với biến i để lưu vị trí của ký tự trong mảng. Biến i bắt đầu từ 0 và sẽ được cập nhật trong vòng lặp để đi đến vị trí mới trong mảng arr. Chúng ta sử dụng câu lệnh if để kiểm tra xem phần tử ở vị trí i trong mảng arr có giống với ký tự trong chuỗi không. Nếu giống, chúng ta sẽ break. Chúng ta vẫn có thể sử dụng câu lệnh print để debug:
i = 0 while i < len(arr): if character == arr[i]: print('Giống') break i = i + 1
Code hoàn hảo sẽ là :
arr = ['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'] tiep = 'y' while tiep == 'y': plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper() jump = int(input("Bạn muốn dịch sang mấy ký tự? ")) t = '' for character in plaintext: i = 0 while i < len(arr): if character == arr[i]: print('Giống') break i = i + 1 tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')
Bước 3: Mã hoá ký tự:
Sau khi xác định được vị trí i của một ký tự trong chuỗi, chúng ta sẽ sử dụng công thức tìm vị trí mới ở trong phần thuật toán để xác định ký tự sau khi mã hoá:
character_code = arr[i + jump - len(arr) * ((i + jump) // len(arr))]
Ngoài ra, tất cả chúng ta sẽ thêm một trường hợp. Nếu ký tự là khoảng chừng trắng thì ký tự sau khi mã hóa cũng sẽ là khoảng chừng trắng :
elif character == ' ': character_code = ' '
Code hoàn hảo sẽ là :
arr = ['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'] tiep = 'y' while tiep == 'y': plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper() jump = int(input("Bạn muốn dịch sang mấy ký tự? ")) t = '' for character in plaintext: i = 0 while i < len(arr): if character == arr[i]: character_code = arr[i + jump - len(arr) * ((i + jump) // len(arr))] break elif character == ' ': character_code = ' ' i = i + 1 tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')
Bước 4: Kết nối các ký tự sau khi mã hoá thành chuỗi:
Các ký tự trong chuỗi có thể được xem như một chuỗi con. Để kết nối hai chuỗi thành một chuỗi, chúng ta sử dụng +:
t = t + character_code
Ở bước 1, tất cả chúng ta đã sử dụng biến t để lưu câu sau khi được mã hóa. Cuối cùng, tất cả chúng ta sẽ in ra câu sau khi được mã hóa :
print('Câu sau khi được mã hoá là: %s' % t)
Chúng ta sử dụng %s để thêm vào một biến có kiểu dữ liệu chuỗi vào câu lệnh print. Ngoài ra chúng ta sẽ thêm % cùng với tên biến.
5. Tada!!!
Như vậy, những bạn học viên đã triển khai xong xong game giúp mã hóa và giải thuật Caesar nhanh gọn rồi đấy. Tuy quy trình làm game không ít khó khăn vất vả nhưng chắc như đinh thành quả của những bạn rất có ích để vận dụng ngay trong đời sống. Chúng ta trọn vẹn hoàn toàn có thể sử dụng chương trình này để mã hóa ngay một câu đố và đem cho mọi người đau đầu giải thuật .
Chương trình Python hoàn hảo của game sẽ là :# -*- coding: utf-8 -*- arr = ['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'] tiep = 'y' while tiep == 'y': plaintext = str(input("Bạn hãy nhập câu muốn mã hoá: ")).upper() jump = int(input("Bạn muốn dịch sang mấy ký tự? ")) t = '' for character in plaintext: i = 0 while i < len(arr): if character == arr[i]: character_code = arr[i + jump - len(arr) * ((i + jump) // len(arr))] break elif character == ' ': character_code = ' ' i = i + 1 t = t + character_code print('Câu sau khi được mã hoá là: %s' % t) tiep = input('Nhập y để tiếp tục hoặc n để thoát: ')
Có rất nhiều cách chúng ta có thể cải tiến game này. Các bạn hãy nghĩ một cách nào đó chúng ta có thể loại bỏ vòng lặp while sử dụng để đi qua các phần tử trong mảng arr. Ngoài ra, các bạn có thể cải tiến game bằng cách mã hoá cả chữ hoa và chữ thường, chứ không cần phải chuyển hết sang chữ hoa.
Không chỉ vậy, thầy Harry và thầy Đức có một gợi ý hữu ích cho các bạn học sinh. Nếu chúng ta còn nhớ trong bài Vui học cùng thầy cô 1, thầy Đức đã giới thiệu cho chúng ta bảng mã ASCII. Trong bảng mã ASCII cũng có hai bảng chữ cái in hoa và in thường đấy. Chúng ta có thể chuyển một ký tự sang mã ASCII bằng câu lệnh ord() và chuyển từ mã ASCII về lại ký tự bằng câu lệnh chr(). Sau đó, chúng ta có thể chuyển từ số trong bảng mã ASCII thành vị trí của một phần tử trong mảng arr. Các bạn hãy cùng thử nhé!
Một gợi ý nữa để cải tiến game đó là chúng ta có thể sử dụng phép toán % trong Python để tính số lần chúng ta đi hết mảng arr. Phép toán này giúp chúng ta tìm số dư trong một phép chia. Ví dụ: 3 % 2 = 1.
Nhờ vận dụng ngay kỹ năng và kiến thức của bài 3 khóa CS 101, bạn Đức Hoàng đã tạo ra được game “ Mã hóa Caesar ” rất là mê hoặc và trong thực tiễn. Các bạn học viên cũng hãy thử bắt tay vào phát minh sáng tạo một game cho riêng mình nhé ! Sau khi triển khai xong game, những bạn hoàn toàn có thể san sẻ game của mình trên STEAMese Profile .
— — —
STEAM for Vietnam Foundation là tổ chức triển khai phi doanh thu 501 ( c ) ( 3 ) được xây dựng tại Hoa Kỳ với thiên chức thôi thúc những hoạt động giải trí tương quan tới giáo dục STEAM ( Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học ) tại Việt nam. STEAM for Vietnam được xây dựng và quản lý và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên viên người Việt trên khắp quốc tế .
— — —
📧 E-Mail : [email protected]🌐Website: www.steamforvietnam.org
Xem thêm: 7 phương pháp dạy học tiếng việt theo hướng phát triển năng lực hiệu quả – https://thomaygiat.com
🌐 Fanpage : STEAM for Vietnam
📺 YouTube : http://bit.ly/S4V_YT
🌐 Zalo : Zalo Official
Source: https://thomaygiat.com
Category : Kỹ Thuật Số
Chuyển vùng quốc tế MobiFone và 4 điều cần biết – MobifoneGo
Muốn chuyển vùng quốc tế đối với thuê bao MobiFone thì có những cách nào? Đừng lo lắng, bài viết này của MobiFoneGo sẽ giúp…
Cách copy dữ liệu từ ổ cứng này sang ổ cứng khác
Bạn đang vướng mắc không biết làm thế nào để hoàn toàn có thể copy dữ liệu từ ổ cứng này sang ổ cứng khác…
Hướng dẫn xử lý dữ liệu từ máy chấm công bằng Excel
Hướng dẫn xử lý dữ liệu từ máy chấm công bằng Excel Xử lý dữ liệu từ máy chấm công là việc làm vô cùng…
Cách nhanh nhất để chuyển đổi từ Android sang iPhone 11 | https://thomaygiat.com
Bạn đã mua cho mình một chiếc iPhone 11 mới lạ vừa ra mắt, hoặc có thể bạn đã vung tiền và có một chiếc…
Giải pháp bảo mật thông tin trong các hệ cơ sở dữ liệu phổ biến hiện nay
Hiện nay, với sự phát triển mạnh mẽ của công nghệ 4.0 trong đó có internet và các thiết bị công nghệ số. Với các…
4 điều bạn cần lưu ý khi sao lưu dữ liệu trên máy tính
08/10/2020những chú ý khi tiến hành sao lưu dữ liệu trên máy tính trong bài viết dưới đây của máy tính An Phát để bạn…