Trong mật mã học, một ngành toán học ứng dụng cho công nghệ thông tin, mã hóa là phương pháp để biến thông tin (phim ảnh, văn bản, hình ảnh...) từ định dạng bình thường sang dạng thông tin không thể hiểu được nếu không có phương tiện giải mã.
Giải mã là phương pháp để đưa từ dạng thông tin đã được mã hóa về dạng thông tin ban đầu, quá trình ngược của mã hóa.
Một hệ thống mã hóa bao gồm các thành phần:
- thông tin trước khi mã hóa, kí hiệu là P
- thông tin sau khi mã hóa, kí hiệu là C
- chìa khóa, kí hiệu là K
- phương pháp mã hóa/giải mã, kí hiệu là E/D.
Quá trình mã hóa được tiến hành bằng cách áp dụng hàm toán học E lên thông tin P, vốn được biểu diễn dưới dạng số, để trở thành thông tin đã mã hóa C.
Quá trình giải mã được tiến hành ngược lại: áp dụng hàm D lên thông tin C để được thông tin đã giải mã P.
Các hệ thống mã hóa
Có hệ thống mã hóa đối xứng và hệ thống mã hóa bất đối xứng. Hai loại mã hóa này khác nhau ở số lượng khóa. Mã hóa đối xứng sử dụng cùng một khóa để mã hóa/giải mã. Trong khi đó, mã hóa bất đối xứng sử dụng hai khóa khác nhau để mã hóa và giải mã thông tin. Mỗi hệ thống mã hóa có ưu nhược điểm riêng. Mã hóa đối xứng xử lí nhanh nhưng độ an toàn không cao. Mã hóa bất đối xứng xử lí chậm hơn, nhưng độ an toàn và tính thuân tiện trong quản lí khóa cao. Trong các ứng dụng mã hóa hiện tại, người ta thường kết hợp các ưu điểm của cả hai loại mã hóa này.
Ứng dụng
Mã hóa có vai trò rất quan trọng, đặc biệt là trong giao dịch điện tử. Nó giúp đảm bảo bí mật, toàn vẹn của thông tin, khi thông tin đó được truyền trên mạng. Mã hóa cũng là nền tảng của kĩ thuật chữ ký điện tử, hệ thống PKI...
(wikipedia.org)
Ví Dụ:(bài tập lớp CNTN2013)Quy tắc mã hóa :
Đoạn thông điệp được mã hóa là một đoạn văn bản có ý nghĩa. Đầu và cuối thông điệp không có khoảng trắng. Các ký tự sử dụng trong đoạn văn bản này là các ký tự có giá trị từ 32 đến 126 trong bảng mã ASCII.
Đoạn văn bản được mã hóa theo một khoá K. Khoá K có giá trị trong đoạn [0, 255].
- Bước 1: Các ký tự trong thông điệp ban đầu sẽ được chuyển sang dạng nhị phân.
- Bước 2: Các ký tự này (ở dạng nhị phân) sẽ thực hiện phép toán XOR với khóa K cho trước để được bản tin đã mã hoá.
- Bước 3: Dãy nhị phân của bản tin đã mã hóa được chia thành các nhóm 5 bit. Mỗi nhóm 5 bit này được thêm vào bit 1 ở đầu và chuyển thành ký tự có mã ASCII tương ứng.
Các đội sẽ nhận được bản tin đã mã hoá sang dạng ký tự ASCII như ở bước 3 và khóa K. Nhiệm vụ của các đội là giải ra đoạn văn bản thông điệp ban đầu.
Sau đây là mã nguồn của chương trình encode và decode theo quy tắt trên:
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
string encode(int& k, string str) {
string ans;
int n = str.length(), m;
do {
ans = "";
ans = "";
k = rand()%256;
int tmps = 0;
m = 0;
for (int i = 0; i < n; i++) {
tmps = (tmps << 8) + (k ^ str[i]);
while (8*i-5*m+3 >= 0) {
int base = 1 << (8*i-5*m+3);
ans = ans + char(32 + tmps / base);
tmps = tmps % base;
m++;
}
}
} while (ans[0] == 32 || ans[m-1] == 32);
return ans;
return ans;
}
string decode(int k, string str) {
string ans = "";
int n = str.length(), m;
int tmps = 0;
m = 0;
for (int i = 0; i < n; i++) {
tmps = (tmps << 5) + str[i] - 32;
while (5*i-8*m-3 >= 0) {
int base = 1 << (5*i-8*m-3);
ans = ans + char((tmps / base) ^ k);
tmps = tmps % base;
m++;
}
}
return ans;
}
int main() {
int k;
string str, ans;
cout << "Do you want to encode or decode? (E/D): ";
getline(cin, str);
if (str == "E") {
cout << "Input the message: ";
getline(cin, str);
ans = encode(k, str);
cout << "Key: " << k << "\n" << "Encoded message: " << ans << "\n";
cout << "Key: " << k << "\n" << "Encoded message: " << ans << "\n";
}
else {
cout << "Input the message: ";
getline(cin, str);
cout << "Input the key: ";
cin >> k;
ans = decode(k, str);
cout << "Decoded message: "<< ans << "\n";
cout << "Decoded message: "<< ans << "\n";
}
return 0;
}
Test:
-Key: 202
-Message: 0".+-9=6470.;:5%4#0?7:5)0+=.5>?94:2:+('*1&??==/*3:?8!:5$6;3;->/+
Test:
-Key: 202
-Message: 0".+-9=6470.;:5%4#0?7:5)0+=.5>?94:2:+('*1&??==/*3:?8!:5$6;3;->/+
"Nhớ G+1 cho blog của tui nhe!" :v
ReplyDeleteCái đoạn này là sao vậy? Mình không hiểu:
ReplyDeletefor (int i = 0; i < n; i++) {
tmps = (tmps << 5) + str[i] - 32;
while (5*i-8*m-3 >= 0) {
int base = 1 << (5*i-8*m-3);
ans = ans + char((tmps / base) ^ k);
tmps = tmps % base;
m++;
}
}