2.2. Phép chiếu một đoạn thẳng lên một đoạn thẳng
2.2.1. Phép chiếu thu nhỏ đồng dạng
Hình chiếu [y1,y2] của [x1,x2] lên [a,b] (hình 2.2) đƣợc xác định theo công thức:
y1 = [a,b] x1 y2 = [a,b] x2 và ký hiệu: [y1,y2] = [a,b] [x1,x2] (2.5) hoặc [y1,y2] = f[a,b][ x1,x2]
Nhận xét: [y1y2] chính là phép chiếu thu nhỏ đồng dạng của [x1,x2] từ [0,D] lên [a,b]. 2.2.1. Phép biến đổi ngƣợc Tƣơng tự nếu: x1 = [a,b] y1 x2 = [a,b] y2 thì ta nói:
[x1,x2] là nghịch ảnh của [y1,y2] theo [a,b] và ký hiệu:
[x1,x2] = [a,b] [y1,y2] (2.6)
hoặc:
[x1,x2] = [ y1,y2]
Nhận xét: Trong chƣơng 3 sẽ dùng phép chiếu thu nhỏ đồng dạng để diễn đạt thuật toán mã hóa và phép biến đổi ngƣợc để trình bày thuật toán giải mã.
2.2.3. Định lý 1
Cho đoạn [0,D] và các đoạn con A = [A1,A2], B = [B1,B2], C = [C1,C2]
Chiếu B lên A đƣợc X (hình 2.3): X = fAB (2.7) Chiếu C lên X đƣợc Y (hình 2.4): Y = fXC (2.8) Khi đó: Y = fBC (2.9) Hay nói cách khác: y2 x2 x1 y1 0 D a b Hình 2.2
= fBC Chứng minh: Từ hình 2.3 suy ra: hay X1 = A1 + B1(A2-A1)/D (2.10) Tƣơng tự: X2 = A1 + B2(A2-A1)/D (2.11) Từ hình 2.4 suy ra: hay Y1 = X1 + C1(X2-X1)/D (2.12) Tƣơng tự: Y2 = X1 + C2(X2-X1)/D (2.13) Bằng cách trừ (2.11) cho (2.10) ta đƣợc: X2-X1 = A1 + B2(A2-A1)/D - (A1 + B1(A2-A1)/D) suy ra: X2-X1 = (A2-A1)(B2-B1)/D (2.14) Đặt Z = Y từ hình 2.5 ta có: hay Z1 = (Y1-A1)D/(A2-A1) (2.15) Tƣơng tự: Z2 = (Y2-A1)D/(A2-A1) (2.16)
Thay Y1 trong (2.12) vào (2.15) ta đƣợc: Z1 = (X1 + C1(X2-X1)/D-A1)D/(A2-A1)
Thay X1 trong (2.10) và (X2-X1) trong (2.14) vào vế phải của công thức trên ta đƣợc: Z1 = (A1 + B1(A2-A1)/D + C1(A2-A1)(B2-B1)/D2- A1) D/(A2-A1) Z1 = (A2-A1)/D[B1 + C1(B2-B1)/D]D/(A2-A1) Z2 Z1 0 D Hình 2.5 Chiếu Z1Z2 lên A1A2 B2 B1 0 D Hình 2.3 Chiếu B1B2 lên A1A2 C2 C1 0 D Hình 2.4 Chiếu C1C2 lên X1X2
Z1 = B1 + C1(B2-B1)/D (2.17) Tuơng tự, thay Y2 trong (2.13) vào (2.16) ta đƣợc:
Z2 = (X1 + C2(X2-X1)/D - A1)D/(A2-A1)
Thay X1 trong (2.10) và (X2-X1) trong (2.14) vào vế phải của công thức trên ta đƣợc: Z2 = (A1 + B1(A2-A1)/D + C2(A2-A1)(B2-B1)/D2- A1) D/(A2-A1) Z2 = (A2-A1)/D[B1 + C2(B2-B1)/D]D/(A2-A1) Z2 = B1 + C2(B2-B1)/D (2.18) Từ (2.17) và (2.18) suy ra: Z = fBC (2.19) Đó là điều cần chứng minh. 2.3. Một số tính chất của phép chiếu
Sử dụng các công thức (2.1)-(2.6) có thể chứng minh các tính chất sau đây đối với phép chiếu thu nhỏ đồng dạng và phép biến đổi ngƣợc. Các tính chất này đƣợc sử dụng để chứng minh tính đúng đắn của thuật toán giải mã trong chƣơng 3.
2.3.1. Tính chất kết hợp
Đối với 2 phép chiếu ta có:
(AB) C = A(BC) (2.20)
Đối với n phép chiếu (n2) ta có:
((A1 A2) …An-1)An = A1 (A2 …(An-1An)) (2.21) Chứng minh tính chất kết hợp đối với 2 phép chiếu:
Theo định lý 1 ta có: Chiếu B lên A đƣợc X: X = fAB Chiếu C lên X đƣợc Y: Y = fXC Ta sẽ có: f-1AY = fBC, tác động cả 2 vế với fA ta có: fA(f-1AY) = fA(fBC) (2.22) Ta thấy: fA(f-1AY) = Y mà Y = fXC nên fA(f-1AY) = fXC = XC do X = fAB = AB nên ta có:
fA(f-1AY) = (AB) C (2.23)
fA(fBC) = A (BC) (2.24)
Từ (2.23), (2.24) và (2.22) thì (2.20) đƣợc chứng minh.
Đối với 3 phép chiếu ta có:
(AB C)D = A(B(CD)) (2.25)
Đặt VT = (AB C)D và X = B C VT = (AX)D
Áp dụng tính chất kết hợp của 2 phép chiếu ta có
VT = A(XD) = A((B C)D) = A(B (CD)) (2.26)
Theo (2.25), (2.26) thì tính chất kết hợp của 3 phép chiếu đƣợc chứng minh.
Tính chất kết hợp của n phép chiếu (n2) ta chứng minh bằng cách tƣơng tự.
2.3.2. Tính chất chứa trong
Ảnh của [x1,x2] lên [a,b] luôn luôn thuộc [a,b] hay nói cách khác:
Nếu: [y1,y2] = [a,b] [x1,x2] thì [y1,y2] [a,b] (2.27)
2.3.3. Tính chất chứa trong của phép chiếu ngƣợc
Nếu
y Y
X = BY (X là nghịch ảnh của Y theo B)
thì
Chƣơng 3. CẢI TIẾN PHƢƠNG PHÁP MÃ HÓA SỐ HỌC
Tóm tắt chương :
Chương 3 trình bày các kết quả chính của luận văn, gồm các nội dung sau : Mô tả thuật toán giải mã và mã hóa số học thông qua các phép chiếu thu nhỏ đồng dạng và phép biến đổi ngược. Sử dụng các tính chất của phép chiếu để chứng minh tính đúng đắn của thuật toán giải mã. So với cách trình bày về mã hóa số học truyền thống trong các tài liệu trước đây [14] [19] [20], cách trình bày và cách chứng minh trong chương này tỏ ra ngắn gọn và dễ hiểu hơn. Hơn nữa trong chương này còn đề xuất một số cải tiến nhằm tăng tốc độ thực hiện của thuật toán bằng việc thay thế các phép nhân, chia bởi các phép dịch chuyển bít và đề xuất một mô hình mã hóa số học mới dựa trên ý tưởng của mô hình RAC [15] nhằm nâng cao khả năng bảo mật cho phương pháp.
3.1. Giới thiệu phƣơng pháp mã hóa số học
Phƣơng pháp mã hóa số học đƣợc đề xuất bởi Shannon vào năm 1948, sau đó đƣợc tiếp tục phát triển bởi Elias nhƣng không công bố kết quả nghiên cứu của mình. Năm 1963 Abramson đã đƣa vấn đề này trong bài viết của ông về lý thuyết thông tin. Về mặt toán học phƣơng pháp này khá đơn giản nhƣng khi thực hiện lại đòi hỏi độ chính xác tuyệt đối cho nên nó chỉ đƣợc nghiên cứu về mặt lý thuyết chứ chƣa đƣợc cài đặt trên máy tính [12]. Việc cài đặt phƣơng pháp mã hóa số học gặp phải vấn đề là tốc độ thực hiện của thuật toán mã hóa và giải mã chậm vì phải tính toán các phép nhân, chia trên các số nguyên lớn có độ dài hàng trăm chữ số. Tuy nhiên trong những năm gần đây mã hóa số học đƣợc nhiều ngƣời nghiên cứu nhằm ứng dụng vào thực tế.
Trong chƣơng này sẽ dùng phép chiếu thu nhỏ đồng dạng để mô tả thuật toán mã hóa số học, dùng phép biến đổi ngƣợc để diễn đạt thuật toán giải mã và sử dụng các tính chất của phép chiếu để chứng minh tính đúng đắn của thuật toán giải mã. So với cách trình bày về mã hóa số học truyền thống trong các tài liệu trƣớc đây [14] [19] [20], cách trình bày và cách chứng minh trong chƣơng này tỏ ra ngắn gọn và dễ hiểu hơn. Hơn nữa còn đề xuất một số cải tiến nhằm tăng tốc độ thực hiện của thuật toán bằng việc thay thế các phép nhân, chia bởi các phép dịch chuyển bít. Ngoài ra luận văn còn trình bày một mô
hình mã hóa số học mới dựa trên ý tƣởng của mô hình RAC [15] nhằm nâng cao khả năng bảo mật.
3.2. Thuật toán mã hóa số học truyền thống
3.2.1. Thuật toán mã hóa
Để thực hiện thuật toán mã hóa số học, trƣớc tiên cần xác định miền phân bố của tập ký tự khác nhau của bản rõ.
3.2.1.1. Thống kê tần suất và xác định miền phân bố của các ký tự trong bản rõ rõ
Vấn đề này đƣợc trình bày thông qua một ví dụ. Giả sử bản rõ là một chuỗi ký tự: "CABAB" thì kết quả thống kê tần suất nhƣ sau:
STT Ký tự Tần suất
1 A 2
2 B 2
3 C 1
Bảng 3.1 Bảng tần suất của các ký tự
Gọi m là số ký tự trong bảng tần suất (ở ví dụ này m = 3). Ký hiệu:
ch[i] là ký tự thứ i trong bảng tần suất (ở ví dụ trên: ch[1] = „A‟, ch[3] = „C‟) P(ch[i]) = [low_range(ch[i]), hi_range(ch[i])) là miền phân bố của ký tự ch[i] Để xác định miền phân bố, đầu tiên chọn đoạn cơ sở [0,D]. Sau đó chia [0,D] thành m đoạn con dựa theo tần suất của các ký tự. Với bản rõ nhƣ trên và D =1000 thì miền phân bố của các ký tự nhƣ sau:
STT Ký tự Miền phân bố low_range hi_range
1 A [0 – 400) 0 400
2 B [400 – 800) 400 800
3 C [800 – 1000) 800 1000
Bảng 3.2 Bảng phân bố với D = 1000 và dựa theo tần suất
Nhận xét: các miền phân bố không nhất thiết phải tính theo tần suất mà chỉ cần xác định sao cho không giao nhau và thuộc [0,D]. Trong mục 3.3 sẽ đề xuất các cách chọn miền phân bố hợp lý để cải tiến thuật toán mã hóa số học nhằm nâng cao tốc độ tính toán.
3.2.1.2. Ý tƣởng của thuật toán mã hóa
Xem bản rõ là một chuỗi gồm n ký tự. Gọi kt[i] là ký tự thứ i của bản rõ tính từ trái qua phải, i = 1,2,...,n (trong ví dụ trên: kt[1] = „C‟, kt[3] = „B‟). Gọi Sk (k = 1,2,...,n) là chuỗi con gồm k ký tự đầu tiên, tức Sk gồm các ký tự kt[1], kt[2], ..., kt[k]. Với bản rõ nhƣ trên thì các chuỗi con là:
S1 = "C" ; S2 = "CA" ;S3 = "CAB" ; S4 = "CABA" ;S5 = "CABAB"
Mỗi chuỗi con sẽ có miền mã là một đoạn thẳng (kín đầu trái, hở đầu phải) nằm trong đoạn [0, D]. Gọi :
Ti = [low_code[i], hi_code[i]) là miền mã của chuỗi con Si Các đoạn Ti đƣợc xác định nhƣ sau :
Với i=1, chuỗi S1 gồm một ký tự, thì T1 chính là miền phân bố của ký tự này: T1 = P(kt[1])
low_code[1] = low_range[kt[1]] (3.1)
hi_code[1] = hi_range[kt[1]] (3.2)
Với i=2,...,n thì Ti đƣợc xác định theo công thức lặp:
Ti = Ti-1 P(kt[i]) (3.3)
(Ti là hình chiếu của P(kt[i]) lên Ti-1)
3.2.1.3. Thuật toán mã hóa
Input:
- n: độ dài theo ký tự của bản rõ - dãy ký tự của bản rõ kt[i] (i=1,2...,n) - m: số ký tự của bảng phân bố
- low_range(ch[i]), hi_range(ch[i]) ứng với mỗi ký tự ch[i] trong bảng phân bố (i=1,...m)
Output:
- code: mã của bản rõ
Thuật toán:
low_code[1] = low_range[kt[1]] //tƣơng đƣơng (3.1)
for(i = 2; i ≤ n; i++) { low_code[i] = low_code[i-1]+ (low_range[kt[i]]×(hi_code[i-1]-low_code[i-1]))/D (3.4) hi_code[i] = low_code[i-1]+ (hi_range[kt[i]]×(hi_code[i-1]-low_code[i-1]))/D (3.5) } (Các công thức (3.4) và (3.5) đƣợc xác định từ (2.1), (2.5) và (3.3))
Mã số của bản rõ: Có thể chọn một giá trị bất kỳ của miền mã Tn làm mã số cho bản rõ. Gọi code là mã số của bản rõ thì code thỏa mãn điều kiện:
code Tn = [ low_code[n], hi_code[n]) (3.6)
Nhận xét: Thực chất thuật toán mã hoá là xác định đoạn mã cho các chuỗi con Sk của bản rõ bằng cách áp dụng liên tiếp phép thu nhỏ đồng dạng. Các đoạn này bị thu nhỏ rất nhanh và khi một đoạn có độ dài bằng 1 thì thuật toán không thể tiếp tục được. Vì vậy để cài đặt trên máy tính cần sử dụng các kiểu số nguyên lớn từ vài chục đến vài trăm byte, ngoài ra phải chia bản rõ thành các khối và thực hiện mã hoá theo từng khối.
3.2.2. Thuật toán giải mã
3.2.2.1. Hàm g(x) trên [0,D)
Để tìm các ký tự của bản rõ theo giá trị mã, cần sử dụng hàm g(x). Hàm này xác định với mỗi x[0,D) theo công thức:
g(x) = ch[j] nếu x thuộc miền P(ch[j]) Ví dụ với miền phân bố trong bảng 2 thì:
- Với x = 400, g(x) = „B‟ - Với x = 399, g(x) = „A‟
3.2.2.2. Ý tƣởng của thuật toán giải mã
Từ mã số code của bản rõ cần khôi phục các ký tự z[i] (i=1,...,n) của bản rõ. Ý tƣởng của thuật toán nhƣ sau:
code[1] = code (3.7)
z[1] = g(code[1]) (3.8)
Với i=2,...,n thì
code[i] = P(z[i-1]) code[i-1] (3.9)
(code[i] là nghịch ảnh của code[i-1] theo [low_range(z[i-1]), hi_range(z[i-1])] )
z[i] = g(code[i]) (3.10)
3.2.2.3. Thuật toán giải mã
Input:
- code: là mã của bản rõ - n: số ký tự của bản rõ
- bảng phân bố của các ký tự khác nhau trong bản rõ (bảng 3.2)
Output:
z[i] với i=1,2,...,n
Thuật toán:
code[1] = code //theo (3.7)
z[1] = g(code[1]) //theo (3.8)
for(i=2; i ≤ n; i++) {
code[i] = (3.11)
z[i] = g(code[i]) // xác định các ký tự tiếp theo }
(Công thức (3.11) đƣợc xác định dựa vào (2.3), (2.6) và (3.9))
Nhận xét: Trong các công thức của thuật toán mã hóa và giải mã chứa giá trị cận trên và cận dưới của miền phân bố. Vì vậy bằng cách chọn các giá trị này một cách hợp lý có thể làm giảm khối lượng tính toán của các thuật toán. Ý tưởng này sẽ được thực hiện trong mục 3.3
3.2.2.4. Chứng minh tính đúng đắn của thuật toán
Điều cần chứng minh:
nói cách khác:
code[i] P(kt[i]), với i = 1, ..., n (3.13)
Để dễ theo dõi ta xét n=4, khi đó thuật toán mã hóa (3.1)-(3.3) đƣợc biểu diễn nhƣ sau:
Theo tính chất kết hợp (mục 2.3.1), từ (3.14) ta có:
T4 = P(kt[1]) (P(kt[2] (P(kt[3] P(kt[4]))) (3.15)
nên theo tính chất chứa trong (mục 2.3.2) suy ra: T4 P(kt[1])
Măt khác theo (3.6)-(3.7) ta có: code[1] = code T4
Nên: code[1] P(kt[1]). Nhƣ vậy (3.13) đúng với i=1, có nghĩa z[1] = kt[1]. Tiếp tục xét (3.13) với i = 2. Theo (3.9) và do z[1] = kt[1] ta có:
code[2] = P(kt[1]) code[1] mà
code[1] T4
Nên theo tính chất chứa trong của phép biến đổi ngƣợc suy ra: code[2] P(kt[1])T4
Mặt khác theo (3.15) thì :
P(kt[1])T4 = (P(kt[2]) (P(kt[3]) P(kt[4])))
Ngoài ra theo tính chất chứa trong thì:(P(kt[2])(P(kt[3])P(kt[4])))P(kt[2]) nên: code[2] P(kt[2]). Vậy (3.13) đúng với i=2, nghĩa là z[2] = kt[2]. Bằng cách lập luận tƣơng tự sẽ suy ra z[i] = kt[i] (i=3,4,...,n). Đó là điều cần chứng minh.
3.2.2.5. Nhận xét về thuật toán giải mã
Thuật toán mã hóa trình bày tại mục 3.2.1 hoàn toàn giống nhƣ thuật toán mã hóa số học truyền thống. Nhƣng thuật toán giải mã trình bày tại mục 3.2.2 có một vài điểm khác so với thuật toán giải mã trình bày trong tài liệu [20]. Thực chất thuật toán giải mã
trong [20] theo cách ký hiệu của phép chiếu thu nhỏ đồng dạng và phép biến đổi ngƣợc đƣợc trình bày nhƣ sau :
Thuật toán mã hóa:
Tn = P(kt[1]) P(kt[2]) … P(kt[n])
Thuật toán giải mã gốc:
code[1] = code
do code[1] P(kt[1]) nên z[1] = kt[1] for(i=2 ; i ≤ n ; i++)
{
code[i] = Ti-1 → code ;
Dƣới đây sẽ chứng minh code[i] P(kt[i]) nên z[i] = kt[i]
}
Để chứng minh tính đúng đắn của thuật toán này cần chỉ ra: code[i] P(kt[i])
Theo thuật toán giải mã ta có :
Tn = (P(kt[1]) … P(kt[i-1]) (P(kt[i]) … P(kt[n]) Suy ra:
Ti-1 → Tn = (P(kt[i]) … P(kt[n]) Do code Tn nên:
Ti-1 → code[i] P(kt[i]) … P(kt[n] Suy ra:
code[i] = Ti-1 → code[i-1] P(kt[i]) đây là điều phải chứng minh.
Nhƣ vậy cách chứng minh này đơn giản hơn so với cách chứngminh trong [20], ngoài ra số phép toán cần thực hiện của thuật toán giải mã tại 3.2.2 cũng ít hơn so với thuật toán giải mã trong [20].
3.2.3. Ví dụ
STT Ký tự Tần suất xh Miền phân bố low_range hi_range
1 A 2 [0 – 0,4) 0 0.4
2 B 2 [0,4 – 0,8) 0.4 0.8
3 C 1 [0,8 – 1,0) 0.8 1.0
Bảng 3.3 Miền phân bố của các ký tự với bản rõ CABAB
Quá trình mã hóa thực hiện nhƣ sau:
- Với i = 1 (mã hóa chuỗi S1 = "C"): low_code[1] = low_range[C] = 0.8 hi_code[1] = hi_range[C] = 1.0 - Với i = 2 ((mã hóa chuỗi S2 = "CA")
low_code[2] = low_code[1] + low_range[A]×(hi_code[1] - low_code[1]) = 0.8 + 0×(1.0 - 0.8) = 0.8
hi_code[2] = low_code[1]+hi_range[A] × (hi_code[1] - low_code[1]) = 0.8 + 0.4×(1.0-0.8) = 0.88
- Với i = 3 (mã hóa chuỗi S3 = "CAB")
low_code[3] = low_code[2] + low_range[B]×(hi_code[2] - low_code[2]) = 0.8 + 0.4×(0.88-0.8) = 0.832
hi_code[3] = low_code[2]+hi_range[B] × (hi_code[2] - low_code[2]) = 0.8 + 0.8×(0.88-0.8) = 0.864
- Với i = 4 (mã hóa chuỗi S4 = "CABA")
low_code[4] = low_code[3] + low_range[A]×(hi_code[3] - low_code[3]) = 0.832 + 0×(0.864-0.832) = 0.832
hi_code[4] = low_code[3]+hi_range[A] × (hi_code[3] - low_code[3]) = 0.832 + 0.4(0.864 – 0.832) = 0.848
- Với i = 5 (mã hóa chuỗi S5 = "CABAB")
low_code[5] = low_code[4] + low_range[B]×(hi_code[4] - low_code[4]) = 0.832 + 0.4(0.848-0.832) = 0.83712
hi_code[5] = low_code[4] + hi_range[B] × (hi_code[4] - low_code[4]) = 0.832 + 0.8(0.848-0.832) = 0.84224
Khi đó giá trị code của văn bản đƣợc xác định nhƣ sau:
Quá trình giải mã thực hiện nhƣ sau: - Với i = 1 code[1] = code = 0.83968 z[1] = g(code[1]) = g(0.83968) = 'C' - Với i = 2 code[2] = = code[2] = (0.83968 – 0.8) / (1 – 0.8) = 0.1984 z[2] = g(code[2]) = g(0.1984) = 'A' - Với i = 3 code[3] = (0.1984 – 0.0) / (0.4 – 0.0) = 0.496 z[3] = g(code[3]) = g(0.496) = 'B' - Với i = 4 code[4] = (0.496 – 0.4) / (0.8 – 0.4) = 0.24 z[4] = g(code[4]) = g(0.24) = 'A' - Với i = 5 code[5] = (0.24 – 0) / (0.4 – 0.0) = 0.6 z[5] = g(code[5]) = g(0.6) = 'B'
Nhƣ vậy sau khi giải mã ta khôi phục đƣợc bản rõ ban đầu.
3.3. Thuật toán mã hóa số học cải tiến
Trong các công thức (3.4) và (3.5) của thuật toán mã hóa và công thức (3.11) của thuật toán giải mã phải thực hiện các phép nhân, chia trên các số lớn làm tốc độ tính toán chậm, hạn chế khả năng ứng dụng của thuật toán này. Để giảm khối lƣợng tính toán, chúng tôi đề xuất giải pháp thay các phép nhân, chia bằng các phép dịch bit. Điều này có thể thực hiện đƣợc bằng cách chọn các miền phân bố một cách hợp lý.
3.3.1. Thuật toán mã hóa cải tiến
Chọn D và xác định bảng phân bố (bảng 3.2) nhƣ sau:
- D = 2s (3.16)
- low_range(ch[i]) = 2h[i] (i=1,...,m) (3.17)
Trong đó s, h[i], k[i] cần thỏa mãn điều kiện: - 2h[i]+ 2k[i] ≤ 2h[i+1] (i=1,2,...,m-1) - 2h[m]+ 2k[m] ≤ 2s
Với cách chọn trên thì:
hi_range(ch[i]) = 2h[i] + 2k[i] (i=1,...,m) (3.19)
Nhận xét: Với mỗi ký tự kt[i] của bản rõ (1 ≤ i ≤ n), luôn tồn tại chỉ số duy nhất f(i) trong khoảng từ 1 đến m sao cho:
kt[i] = ch[f(i)] (3.20)
Sử dụng hàm f(i), từ (3.17)-(3.19) có thể xác định miền phân bố của ký tự kt[i] bất kỳ của bản rõ nhƣ sau:
low_range(kt[i]) = 2h[f(i)] (i=1,...,n) (3.21)
hi_range(kt[i]) = 2h[f(i)] + 2k[f(i)] (i=1,...,n) (3.22)
Với cách chọn miền phân bố nhƣ các công thức (3.16), (3.17), (3.19) và dựa vào (3.20), (3.21) thì các phép nhân, chia trong công thức (3.4)-(3.5) đƣợc thay bằng các phép dịch chuyển bit nhƣ sau:
low_code[i] = low_code[i-1]+(low_range[kt[i]]×(hi_code[i-1]-low_code[i-1]))/D = low_code[i-1] + 2h[f(i)] × (hi_code[i-1]-low_code[i-1])×2-s
= low_code[i-1] + (hi_code[i-1]-low_code[i-1])×2-(s-h[f(i)]) Vậy:
low_code[i] = low_code[i-1] + (hi_code[i-1]-low_code[i-1]) >> (s-h[f(i)]) Tƣơng tự ta có:
hi_code[i] = low_code[i-1]+ (hi_range[kt[i]]×(hi_code[i-1]-low_code[i-1]))/D = low_code[i-1]+(2h[f(i)] + 2k[f(i)])×(hi_code[i-1]-low_code[i-1])*2-s = low_code[i-1]+(2-(s-h[f(i)]) + 2-(s-k[f(i)]))×(hi_code[i-1]-low_code[i-1]) = low_code[i-1]+ (hi_code[i-1]-low_code[i-1])×2-(s-h[f(i)])
+ (hi_code[i-1]-low_code[i-1])×2-(s-k[f(i)]) Vậy:
hi_code[i] = low_code[i] + (hi_code[i-1]-low_code[i-1])>>(s-h[f(i)]) + (hi_code[i-1]-low_code[i-1])>>(s-k[f(i)])
low_code[1] = low_range[kt[1]] hi_code[1] = hi_range[kt[1]] for(i=2; i≤n; i++)
{
low_code[i]=low_code[i-1]+(hi_code[i-1]-low_code[i-1])>>(s-h[f(i)]) hi_code[i]=low_code[i]+(hi_code[i-1]-low_code[i-1])>>(s-h[f(i)]) +(hi_code[i-1]-low_code[i-1])>>(s-k[f(i)]) }
3.3.2. Thuật toán giải mã cải tiến
Bằng cách lập luận tƣơng tự, từ (3.20), (3.21) và để ý thêm rằng z[i] = kt[i], i (công thức 3.12) thì các phép nhân, chia trong công thức (2.11) đƣợc thay bằng các phép dịch chuyển bit nhƣ sau:
code[i] =
code[i] = (code[i-1] - 2h[f(i-1)])×2s / (2h[f(i-1)] + 2k[f(i-1)]-2h[f(i-1)]) code[i] = (code[i-1]×2s - 2s+h[f(i-1)]) × 2-k[f(i-1)]
= code[i-1] ×2s-k[f(i-1)]- 2s+h[f(i-1)]- k[f(i-1)] Vậy:
code[i] = (code[i-1]<<(s-k[f(i-1)]))-(2<<(s+h[f(i-1)]-k[f(i-1)])) Vậy ta có thuật toán giải mã đƣợc cải tiến nhƣ sau:
code[1] = code
z[1] = g(code[1]) //xác định đƣợc ký tự đầu tiên của bản rõ for(i=2; i ≤ n; i++)
{
code[i]=(code[i-1]<<(s-k[f(i-1)])) - (2<<(s+h[f(i-1)]-k[f(i-1)])) (3.25) z[i] = g(code[i])// xác định các ký tự tiếp theo
}
Nhận xét: các công thức (3.23), (3.24) và (3.25) trong thuật toán mã hoá và giải mã cải tiến chỉ chứa các phép cộng, trừ và dịch bit nên chẳng những có tốc độ thực hiện nhanh mà còn cho kết quả chính xác.
(3.23) (3.24)
3.4. So sánh độ phức tạp
Để so sánh độ phức tạp của thuật toán mã hóa số học truyền thống so với thuật toán cải tiến ta đánh giá số phép toán mà mỗi thuật toán cần thực hiện. Giả sử cả các thuật toán đƣợc thực hiện trên các số nguyên lớn có độ dài size byte (8×size bit).
3.4.1. Thuật toán mã hóa số học truyền thống
3.4.1.1. Thuật toán mã hóa
Theo (3.4) và (3.5) trong mỗi bƣớc lặp của thuật toán mã hóa cần thực hiện 2 phép nhân và 2 phép chia trên các số nguyên có độ dài 8×size bit (chƣa kể các phép cộng và trừ) vì vậy số phép toán cần thực hiện là:
4× (8×size)2 = 256×size 2 phép nhân bit Vậy tổng số phép toán cần thực hiện là:
256× size 2×n phép nhân bit (3.26)
3.4.1.2. Thuật toán giải mã
Bằng cách phân tích tƣơng tự ta suy ra tổng số phép toán cần thực hiện:
128× size 2×n phép nhân bit (3.27)
3.4.2. Thuật toán mã hóa số học cải tiến