Thuật toán mã hóa Caesar là một trong những thuật toán đơn giản và cổ điển nhất trong lĩnh vực mã hóa. Đây là phương pháp mã hóa bằng cách thay thế mỗi ký tự trong chuỗi bằng một ký tự khác cách nó một số bước cố định trong bảng chữ cái. Bài viết này sẽ hướng dẫn bạn cách triển khai thuật toán mã hoá caesar c++.
Xem thêm:
1. Mô tả bài toán
Bài 32 (TH-CSLT-04): Thuật toán mã hóa Caesar được thực hiện bằng cách thay thế một ký tự bằng 1 ký tự khác cách nó k bước trong bảng chữ cái để tạo thành ký tự mới. Hãy viết hàm nhận 1 xâu s và bước dịch chuyển k (k>1), sau đó thực hiện phép mã hóa trên để thu được xâu ký tự mới (trong bảng mã ASCII).Viết hàm gọi hàm mã hóa trên.
2. Ý tưởng thuật toán
Bước 1: Xác định bảng mã ASCII và xác định vị trí của các ký tự cần mã hóa trong bảng.
Bước 2: Thực hiện phép dịch chuyển k bước để mã hóa ký tự.
Bước 3: Trả về xâu ký tự đã được mã hóa.
2.1. Quy luật mã ascii
– Bản chất kiểu dữ liệu ký tự trong c/c++ nó chính là kiểu dữ liệu số nguyên. 26 chữ cái của bảng ký tự từ ‘a’ đến ‘z’ sẽ tương ứng miền giá trị số nguyên là từ 97 đến 122. Với 97 là mã ascii của ký tự ‘a’, 98 là mã ascii của ký tự ‘b’, 99 là mã ascii của ký tự ‘c’ và cứ thế đến 122 là mã ascii của ký tự ‘z’,…
2.2. Thực hiện phép dịch chuyển k bước để mã hóa ký tự
– Quy luật để thực hiện hiện dịch chuyển k bước để mã hoá ký tự là từ vị trí ký tự hiện tại sẽ cộng lên k lần để lấy ra vị trí ký tự để thay thế tương ứng. Bảng mã ascii của các ký tự là từ 97 (ký tự ‘a’) đến 122 (ký tự ‘z’), cứ thế cộng lên k lần nếu k vượt quá 122 thì sẽ bắt đầu lại từ 97.
Công thức tổng quát cho quá trình mã hoá này là:
c[i] = (s[i] - 97 + k) % 26 + 97
Trong đó:
s[i]
là mã ASCII của ký tự thứ i trong chuỗi ban đầu.k
là số nguyên dương thể hiện số bước dịch vị trong quá trình mã hoá.c[i]
là mã ASCII của ký tự tương ứng sau khi đã được mã hoá.
Giải thích công thức:
(s[i] - 97)
là khoảng cách giữa mã ASCII của ký tự thứ i trong chuỗi ban đầu và mã ASCII của ký tự ‘a’ (mã ASCII của ký tự ‘a’ là 97).+ k
là số bước dịch vị được áp dụng trong quá trình mã hoá.% 26
là toán tử lấy phần dư khi chia cho 26, nghĩa là sau khi cộng với k, nếu kết quả vượt quá giới hạn 26 ký tự (từ ‘a’ đến ‘z’), ta sẽ lấy phần dư để quay lại vị trí đầu tiên của chuỗi.+ 97
là để đưa ký tự được mã hoá về mã ASCII tương ứng.
2.3. Ví dụ minh hoạ
Ví dụ: Giả sử ta muốn mã hoá chuỗi “hello” với k = 3, ta sẽ thực hiện như sau:
- với ký tự ‘h’, ta có mã ASCII là 104. Áp dụng công thức, ta có:
(104 - 97 + 3) % 26 + 97 = 107
, nghĩa là ký tự được mã hoá sẽ là ‘k’. - tương tự, ký tự ‘e’ sẽ được mã hoá thành ‘h’, ký tự ‘l’ sẽ được mã hoá thành ‘o’.
- ký tự ‘l’ thứ hai được mã hoá thành ‘o’, và ký tự ‘o’ được mã hoá thành ‘r’.
3. Cài đặt thuật toán
#include<iostream> #include<string> using namespace std; string encode(string s, int k){ string cipher; int n = s.length(); for(int i=0;i<n;i++){ if(s[i]>=65 && s[i]<=90){ char new_char = ((s[i] - 65) + k) % 26 + 65; cipher +=new_char; }else if(s[i]>=97 && s[i]<=122){ char new_char = ((s[i] - 97) + k) % 26 + 97; cipher +=new_char; }else{ cipher+=s[i]; } } return cipher; } int main(){ int k; string s; cout<<" Nhap k(k>1): "; cin>>k; cin.ignore(); cout<<" Nhap xau s: "; getline(cin,s); string cipher = encode(s,k); cout<<"Chuoi sau khi duoc ma hoa la: "<<cipher; }
4. Kết quả chạy chương trình
Trên đây là đoạn mã đơn giản về thuật toán mã hoá caesar c++ . Cảm ơn các bạn đã theo dõi trên ttnguyen.net
Liên quan: