Giả sử 2 khóa K và H đƣợc sinh ngẫu nhiên và có giá trị nhƣ sau:
K = {2,0,1,1} H={0,1,1,0}
Thuật toán mã hóa thực hiện nhƣ sau:
T0 = [0, 1000) i=1:
kt[1]= C, P(kt[1]) = P(C) = [800, 1000) ;
h1=0 => miền phân bố dịch trái với bƣớc dịch k1 = 2 thành miền phân bố của A hay P(kt[1]) dịch chuyển thành P(kt*[1]) = [0,400)
T1 = T0P(kt[1])* = [0,1000) [0,400) = [0, 400) (theo công thức 3.4 và 3.5) i=2:
kt[2]= A, P(kt[2]) = P(A) = [0, 400) ;
do k2 = 0 (không dịch chuyển) nên P(kt*[2]) = P(kt[2]) = [0,400) T2 = T1P(kt[1])* = [0,400) [0,400) = [0, 160)
i = 3
kt[3]= B, P(kt[3]) = P(B) = [400, 800) ;
h3=1 => miền phân bố dịch phải với bƣớc dịch k3 = 1 thành miền phân bố của C hay P(kt[3]) dịch chuyển thành P(kt*[3]) = [800, 1000)
T3 = T2P(kt[3])* = [0, 160) [0,400) = [128, 160) i = 4
kt[4]= A, P(kt[4]) = P(A) = [0, 400) ;
h4=0 => miền phân bố dịch trái với bƣớc dịch k4 = 1 thành miền phân bố của C hay P(kt[4]) dịch chuyển thành P(kt*[4]) = [800, 1000)
T4 = T3P(kt[4])* = [128, 160) [800,1000) = [153.6 , 160) i =5
kt[5]= B, P(kt[5]) = P(B) = [400, 800);
h5=0 => miền phân bố dịch trái với bƣớc dịch k5 = 2 thành miền phân bố của C hay P(kt[5]) dịch chuyển thành P(kt*[5]) = [800, 1000)
T5 = T4P(kt[5])* = [153.6 , 160) [800,1000) = [158.72 , 160)
Thuật toán giải mã thực hiện nhƣ sau:
i=1
Code[1] = code = 159 thuộc miền phân bố của ký tự A P(kt*[1]) = [0, 400)
h1 = 0 => dịch phải P(kt*[1]), bƣớc dịch là k1 = 2 thành P(kt[1]) = [800, 100) kt[1] là ký tự C (xác định kt[1] dựa vào P(kt[1]))
i=2
code[2] = P(kt*[1]) → code[1] = [0, 400) → 159 = 397.5 (dựa theo công thức 3.11) P(kt*[2]) = [0, 400) h2 = 1, dịch trái P(kt*[2]), bƣớc dịch là k2 = 0 thành P(kt[2]) = [0, 400) k[2] = A i=3 code[3] = P(kt*[2]) → code[2] = [0, 400) → 397.5 = 993.75 P(kt*[3]) = [800, 1000) h3 = 1, dịch trái P(kt*[3]), bƣớc dịch là k3 = 1 thành P(kt[3]) = [400, 800) k[3] = B i=4 code[4] = P(kt*[3]) → code[3] = [800, 1000) → 993.75 = 968.75 P(kt*[4]) = [800, 1000) h4 = 0, dịch phải P(kt*[4]), bƣớc dịch là k4 = 1 thành P(kt[4]) = [0,400) k[3] = A i=5 code[5] = P(kt*[4]) → code[4] = [800, 1000) → 968.75 = 843.75 P(kt*[5]) = [800, 1000) h5 = 0, dịch phải P(kt*[5]), bƣớc dịch là k5 = 2 thành P(kt[5]) = [400,800) k[5] = B
Kết hợp kết quả của từng bƣớc giải mã ta thu đƣợc bản rõ ban đầu là: CABAB
Đánh giá độ phức tạp của thuật toán trên:
1. Số các phƣơng án xây dựng miền phân bố của m ký tự với miền cơ sở [0, D) là:
2. Gọi độ dài của khóa K là u, số các phƣơng án xây dựng K là: mu 3. Gọi độ dài của H là v, số các phƣơng án xây dựng H là: 2v
Số các phƣơng án tạo khóa:
Nhận xét về độ bảo mật của phƣơng pháp đề xuất:
- Số các phƣơng án tạo khóa là rất lớn khó có thể dò tìm trong thời gian ngắn
- Vì bản rõ là một chuỗi các ký tự trong khi đó bản mã lại là một số thực, hình ảnh của bản rõ (các mẫu của bản rõ) không đƣợc thể hiện (lặp lại) trong bản mã nên việc tấn công theo phƣơng pháp thống kê đối với phƣơng pháp này sẽ gặp nhiều khó khăn.
- Phƣơng pháp này cũng rất nhạy cảm với bản rõ, trong mô hình nhị phân miền phân bố của các ký tự là cố định và việc tìm ra miền phân bố này cũng khá đơn giản do chỉ cần tìm ra giá trị p, hơn nữa trong mô hình này chỉ dùng một khóa nhị phân nên độ an toàn chƣa thật sự cao. Trong mô hình luận văn đề xuất miền phân bố của các ký tự là thay đổi theo từng bƣớc và phụ thuộc vào 3 yếu tố: ký tự hiện tại, khóa k và khóa h. Vì vậy độ bảo mật cũng đƣợc tăng cƣờng đáng kể.
Chƣơng 4. CÀI ĐẶT VÀ THỬ NGHIỆM
Tóm tắt chương: Để cài đặt được phương pháp mã hóa số học phải thao tác trên các số nguyên lớn. Trong chương này sẽ giới thiệu thư viện xử lý số nguyên lớn đã được đưa ra bởi các tác giả trong tài liệu [1]. Thư viện này được dùng để xây dựng phần mềm mã hoá dữ liệu theo phương pháp mã hóa số học truyền thống và phương pháp mã hóa số học cải tiến.Phần cuối chương là một số kết quả thử nghiệm của chương trình.
4.1. Giới thiệu thƣ viện xử lý số nguyên lớn
Hệ thống thƣ viện số nguyên lớn đƣợc tổ chức thành 2 lớp: Lớp hệ thập phân Nglon10 và lớp hệ 256 (gọi là lớp nhị phân) Nglon. Lớp NgLon10 cung cấp một số phƣơng thức nhập, xuất dữ liệu theo hệ 10 để giúp ngƣời dùng dễ dàng nhập dữ liệu hoặc theo dõi kết quả trung gian trong quá trình xử lý. Để giảm thời gian thực hiện trong các phép toán trên số nguyên lớn, lớp nhị phân lƣu trữ số nguyên lớn theo hệ số 256 (byte). Theo đó, mỗi chữ số của số nguyên lớn có thể đƣợc lƣu trữ trực tiếp trên thanh ghi và sử dụng trực tiếp các phép toán cơ bản đƣợc hỗ trợ bởi các bộ vi xử lý. Vì vậy, các phép toán thực hiện trên số nguyên lớn có tốc độ thực hiện nhanh hơn.
Lớp hệ thập phân NgLon10 có 18 phƣơng thức, lớp nhị phân NgLon có 38 phƣơng thức. Do khuôn khổ hạn chế, nên trong luận văn chỉ trình bày cách thức tổ chức dữ liệu của hệ thống thƣ viện và một số phƣơng thức có thuật toán phức tạp.
4.1.1. Cấu trúc của các lớp
class Nglon10 //lớp hệ thập phân { private: int n; char *a; public: //các phƣơng thức };
class Nglon //lớp hệ nhị phân { private: int m; BYTE *b; public: //các phƣơng thức };
Mỗi lớp gồm hai thuộc tính: Thuộc tính thứ nhất là một số nguyên lƣu trữ độ dài của số. Với số hệ thập phân là số chữ số hệ 10, còn số hệ nhị phân là số byte (thực chất là số chữ số trong hệ 256). Thuộc tính thứ hai là con trỏ trỏ tới vùng nhớ dùng để lƣu trữ các chữ số. Với số hệ thập phân, các chữ số có giá trị từ 0 đến 9, còn số hệ nhị phân các chữ số có giá trị từ 0 đến 255.
4.1.2. Bảng luỹ thừa 2 (bảng h)
Bảng h có kiểu Nglon10 dùng để lƣu trữ giá trị thập phân của 2i, trong đó: h[i].n chứa độ dài của giả trị 2i
h[i].a trỏ tới vùng nhớ chứa các chữ số của 2i Ví dụ: