CÁC ĐỊNH LÝ QUAN TRỌNG
Định lý Euler
Cho a Z, m N, m > 1 Nếu UCLN (a, m) = 1 thì a (m) 1 (mod m)
Định lý Fermat (hệ quả của định lý Euler)
Cho a Z và k là một số nguyên tố khi đó a k a (mod k) Nếu UCLN(a, k) = 1 thì a k-1 1 (mod k)
Định lý đồng dƣ Trung Quốc
Cho m 1 , m 2 , …, m r là các số nguyên tố cùng nhau từng đôi một nghĩa là
UCLN(m 1 , m 2 ) = 1 i, j = 1, 2, …, r ; i ≠ j Giả sử a 1 , a 2 , … a r Z khi đó hệ phương trình đồng dư
Có nghiệm duy nhất theo modulo M = m 1 m 2 , … m r là x = r i i i i M y a
Ví dụ: Tìm nghiệm đồng dư của hệ phương trình đồng dư:
Định lý Bezout
+ Tồn tại x, y Z sao cho ax + by = UCLN(a, b) + Nếu a, b nguyên tố cùng nhau thì tồn tại x,y Z | ax + by = 1 + a, b nguyên tố cùng nhau khi và chi khi tồn tại x, y Z | ax + by = 1
MỘT SỐ THUẬT TOÁN
Thuật toán Euclidean
Cơ sở số học của thuật toán:
Cho a, b, d Z, d ≠ 0 nếu a d và b d thì a mod b d
Bước 1: Nếu r 1 = 0 trả về d := r 0 , kết thúc thuật toán Nếu r 1 ≠ chuyển sang bước 2
Bước 2: r := r 0 mod r 1 ; r 0 := r 1 ; r 1 = r; quay lại bước 1
Thuật toán Euclidean mở rộng
Thuật toán Euclidean là phương pháp tìm ước chung lớn nhất (UCNL) của hai số nguyên r0 và r1, trong đó r0 > r1 Quy trình của thuật toán này dựa trên chuỗi phép chia lấy phần dư, giúp xác định UCNL một cách hiệu quả và đơn giản.
UCLN(r 0, r 1 ) = UCLN(r 1, r 2 ) = UCLN(r 2, r 3 ) = … = UCLN(r m-1, r m ) Với r 2 = r 0 mod r 1 r 3 = r 1 mod r 2 …
Dựa trên thuật toán Euclidean người ta mở rộng thuật toán trên để tính được số nghịch đảo theo modulo m trong vành Z m
Xét dãy tuần tự các số nguyên t 0 , t 1 , … t m nhƣ sau: t 0 = 0 t 1 = 1 t j = (t j-2 – q j-1 t j-1 ) mod r 0 , với j 2
Ta có kết quả quan trọng sau: Định lý:
Với mọi j, 0 j 2 ta có r j t j r 1 (mod r 0 )
7 while r > 0 do 7.1 temp = t 0 – qt 7.2 if temp 0 then temp = temp mod n
7.3 if temp < 0 then temp = n – ((-temp) mod n) 7.4 t 0 = t
8 if b 0 ≠ 1 then b không khả nghịch theo modulo n
Thuật toán bình phương và nhân
Để tính x^b mod n với các số nguyên x, b và n, chúng ta sử dụng thuật toán "Bình phương và nhân" Thuật toán này không chỉ đơn giản hóa quá trình tính lũy thừa mà còn đóng vai trò quan trọng trong quy trình mã hóa và giải mã của hệ mã hóa RSA.
INPUT: x Z n , b Z, 0 < b < n, b: viết dưới dạng nhị phân với k chữ số nhị phân b = b 1 b 2 …b k ; b i = {0, 1} OUTPUT: số a = x b mod n
Thuật toán xác suất kiểm tra số nguyên tố
INPUT: một số nguyên dương n OUPUT: n là hợp số
Sau đây ta sẽ đi xem thuật toán Miller - Rabin giải quyết bài toán này
Giả sử n là một số nguyên dương lẻ, ta có thể biểu diễn n - 1 = 2^s * t, trong đó s là số nguyên không âm và t là số nguyên dương lẻ Số n được coi là vượt qua kiểm tra Miller với cơ sở a (với a thuộc Z và a > 0) nếu thỏa mãn điều kiện a^t ≡ 1 (mod n) hoặc a^(2^k * t - 1) (mod n) với k là một số nguyên thích hợp.
Nếu n là một số nguyên tố thì n vƣợt qua kiểm tra Miller cơ sở a, 0 < a < n Định nghĩa:
Nếu n vƣợt qua Miller cơ sở a thì n đƣợc gọi là số nguyên tố giả cơ sở a
Số nguyên dương n > 1 được gọi là số giả nguyên tố mạnh cơ sở a nếu nó là hợp số và vƣợt qua đƣợc kiểm tra Miller cơ sở a
INPUT: n N, lẻ, N > 1 OUTPUT: “n là nguyên tố” hoặc “n là hợp số”
2 Chọn một số ngẫu nhiên a, 1 a n – 1
4 if b = 1 then return “n là số nguyên tố rồi” và kết thúc
6 if b = n – 1 then return “n là số nguyên tố” và thoát
8 Tra lời “n” là hợp số
Thuật toán Miller – Rabin là một phương pháp Monte Carlo dùng để kiểm tra tính nguyên tố của số, trong đó câu trả lời "b là hợp số" luôn chính xác Tuy nhiên, xác suất sai của câu trả lời "n là số nguyên tố" không vượt quá 1/4.
Thuật toán Miller – Rabin với t lần thực hiện kiểm tra Miller:
INPUT: n N, lẻ, n > 1, t N, số lần kiểm tra OUTPUT: “n là nguyên tố” hoặc “n là hợp số”
2.1 Chọn một số ngẫu nhiên a, 1 a n – 1 2.2 test:= false
2.3 b: = a m mod n 2.4 if b = 1 then test: = true else for i = 0 to k – 1 do if b = n – 1 then test:= true else b = b 2 mod n
2.5 if test = false then return “n là hợp số” và thoát
3 return “n là số nguyên tố”
Xác suất sai khi trả lời n là số nguyên tố không vƣợt quá (1/4) t
KHÁI NIỆM ENTROPY
Định nghĩa Entropy
Định nghĩa Độ bất định :
Không gian mẫu được định nghĩa là {w1, w2, w3, , wm} với xác suất của các sự kiện ngẫu nhiên cơ bản là p1, p2, p3, , pm Entropy của không gian mẫu Ω, biểu thị độ bất định trong việc dự đoán sự kiện ngẫu nhiên, được ký hiệu là H(Ω) Giá trị của entropy này được tính theo công thức cụ thể, phản ánh mức độ không chắc chắn trong kết quả của phép thử ngẫu nhiên.
Trong việc đoán nhận sự kiện trong hai sự kiện đồng xác suất, độ bất định không phụ thuộc vào đơn vị đo Nếu chọn đơn vị đo là khả năng đoán nhận một trường hợp trong 100 khả năng, độ bất định sẽ là 3, tức là H(k) = log 100 (k) = 3 Ngược lại, nếu đơn vị đo là khả năng đoán nhận một trường hợp trong 10 khả năng, chỉ số đo sẽ là 6, vì H(k) = log 10 (k) = 2.log 100 (k) = 6 Do đó, chúng ta có thể linh hoạt chọn đơn vị đo, chẳng hạn như δ = 2.
Sau này, chúng ta sẽ dùng công thức log ( )
2 i m i i p p để tính độ bất định
Entropy trong không gian mẫu Ω với xác suất các phần tử p1, p2, p3, , pm cho thấy rằng H( ) càng lớn thì độ khó trong việc dự đoán sự kiện ngẫu nhiên càng tăng, dẫn đến mức độ bất định cao hơn.
Tính chất của Entropy
Entropy là một đại lượng luôn dương hoặc bằng không, với H(Ω) ≥ 0 Khi entropy bằng 0, có một sự kiện ngẫu nhiên cơ bản với xác suất bằng 1, trong khi xác suất của tất cả các sự kiện khác bằng 0, nghĩa là có một sự kiện ngẫu nhiên luôn xảy ra, làm cho việc đoán kết quả trở nên vô nghĩa Ngược lại, entropy đạt giá trị cực đại khi xác suất của các sự kiện ngẫu nhiên cơ bản trong không gian mẫu là bằng nhau, dẫn đến độ bất định lớn nhất trong việc dự đoán sự xảy ra của một sự kiện ngẫu nhiên nào đó.
Nếu Ω, Φ là hai không gian mẫu cùng có m phần tử và nếu Φ là đồng xác suất thì H(Ω) ≤ H(Φ)
Dấu bằng xảy ra khi và chỉ khi mỗi sự kiện ngẫu nhiên cơ bản trong không gian mẫu Ω có xác suất p i, thì trong không gian Ф cũng tồn tại một sự kiện ngẫu nhiên cơ bản với xác suất p i tương ứng Điều này có nghĩa là Ω cũng phải là không gian đồng xác suất.
Định lý này khẳng định rằng entropy của không gian đồng xác suất đạt giá trị lớn nhất so với các không gian mẫu khác có cùng số lượng sự kiện ngẫu nhiên cơ bản.
Khi tung một con xúc sắc có mặt 1 gắn chì, khối lượng chì nặng khiến mặt 6 thường xuyên xuất hiện hơn, vì mặt 6 đối diện với mặt 1 Do đó, việc dự đoán mặt nào sẽ xuất hiện trở nên dễ dàng hơn.
PHƯƠNG PHÁP MÃ HOÁ
CÁC KHÁI NIỆM CƠ BẢN
Nhiệm vụ cơ bản của mật mã học là nghiên cứu các phương pháp giúp hai người truyền thông qua kênh thông tin không an toàn, đảm bảo rằng ngay cả khi thông tin bị đánh cắp, người thứ ba cũng không thể hiểu được nội dung của nó.
Alice gửi thông điệp cho Bob dưới dạng bản rõ (plaintext) ký hiệu là x Để bảo vệ thông tin, Alice sử dụng một cơ chế để chuyển đổi bản rõ x thành bản mã (ciphertext) ký hiệu là y và gửi bản y cho Bob Sau khi nhận được bản mã y, Bob sẽ sử dụng một cơ chế để chuyển đổi y trở lại thành bản rõ x.
Công việc mã hóa (encryption) của Alice chuyển đổi từ bản rõ x sang bản mã y, trong khi Bob thực hiện giải mã (decryption) để chuyển đổi từ bản mã y trở lại thành bản rõ x.
Yêu cầu cơ bản của mỗi hệ mã hoá là đảm bảo quy tắc mã hóa và giải mã có khả năng tính toán hiệu quả Đồng thời, đối phương cần gặp khó khăn trong việc tìm ra bản rõ x hoặc khóa K từ bản mã y trong thời gian cho phép Dưới đây là định nghĩa một hệ mã hoá dưới hình thức toán học.
Một hệ mật mã là một bộ 5 (P, C, K, E, D) trong đó:
1 P là một tập hợp hữu bạn các bản rõ có thể
2 C là một tập hợp hữu hạn các bản mã có thể
3 K, không gian khóa, là một tập hữu hạn các khóa có thể
4 Với mỗi khóa k K, tồn tại một qui tắc mã hóa e k E và một qui tắc giải mã tương ứng d k D, trong đó e t : P C và d k : C P là các ánh xạ thỏa mãn d k (e k (x)) = x x P
Hình 2.1 Nguy cơ bị tấn công khi truyền thông tin trên mạng máy tính
2.1.1 Hệ mã hoá khoá đối xứng
Trong mô hình mã hóa khóa đối xứng, Alice và Bob bí mật chọn khóa K để sử dụng cho cả quy trình mã hóa và giải mã Trong phương pháp này, khóa mã hóa chính là khóa giải mã, hoặc trong một số hệ thống mật, chúng có thể khác nhau nhưng có thể dễ dàng tính toán từ nhau Do đó, các hệ mã hóa khóa đối xứng còn được gọi là hệ mã hóa khóa bị mật Dưới đây là mô hình truyền thông sử dụng hệ mã hóa khóa đối xứng.
Hình 2.2: Mô hình truyền thông sử dụng hệ mã hoá khoá đối xứng [12]
2.1.2 Hệ mã hoá khoá phi đối xứng
Một hạn chế của một hệ mã hoá khoá đối xứng là nó yêu cầu việc truyền đi khóa
Khi Alice và Bob trao đổi thông tin qua một kênh an toàn, họ cần thiết lập một khóa mã hóa trước khi gửi bất kỳ thông điệp nào Tuy nhiên, việc này trở nên khó khăn khi hai người ở xa nhau.
Để khắc phục những hạn chế của hệ mã hóa khóa đối xứng, các nhà nghiên cứu đã phát triển hệ mã hóa công khai (bất đối xứng) Hệ mã hóa này bao gồm hai thành phần khóa: khóa công khai dùng để mã hóa và khóa bí mật (riêng) dùng để giải mã Bob, người nhận thông điệp bí mật, sẽ công khai khóa mã hóa e K và giữ bí mật khóa giải mã d K Alice và những người khác có thể sử dụng e K để mã hóa thông điệp gửi đến Bob Quan trọng là Bob phải đảm bảo rằng khóa d K không thể bị tìm ra từ e K trong thời gian thực Ý tưởng về hệ mã hóa công khai được Diffie và Hellman đề xuất vào năm 1976, và sự hiện thực hóa đầu tiên của nó vào năm 1977 là do Rivest, Shamir và Adleman phát minh ra hệ mã hóa RSA.
Hình 2.3: Mô hình truyền thông sử dụng hệ mã hoá khoá công khai [12]
2.1.3.1 Lịch sử hình thành hệ mã hoá RSA
RSA (Ron Rivers, Adi Shamir và Len Adleman) là một hệ thống mã hóa khóa phi đối xứng, đánh dấu bước tiến quan trọng trong mật mã học với khả năng tạo chữ ký điện tử Thuật toán này, lần đầu tiên được giới thiệu vào năm 1977 tại Học viện công nghệ Massachusetts (MIT), hiện đang được ứng dụng rộng rãi trong giao dịch điện tử, đảm bảo an toàn khi sử dụng độ dài khóa đủ lớn.
Vào năm 1973, nhà toán học người Anh Clifford Cocks đã mô tả một thuật toán tương tự, nhưng do khả năng tính toán hạn chế thời điểm đó, thuật toán này chưa thể thực hiện và chưa bao giờ được cài đặt thực nghiệm Phát minh này chỉ được công bố vào năm 1977 vì lý do bảo mật.
2.1.3.2 Hệ mã hoá RSA đầu tiên
1/ Bài toán phân tích một số tự nhiên ra thừa số nguyên tố
Các thuật toán mã hóa công khai hiện đại được phát triển dựa trên lý thuyết độ phức tạp của thuật toán Những thuật toán này được thiết kế để giải quyết các bài toán khó, nhưng việc tìm ra giải pháp tối ưu vẫn không khả thi trong thời gian thực với các máy tính hiện đại.
Thuật toán RSA là một phương pháp mã hóa dựa trên độ phức tạp của việc phân tích số nguyên thành các thừa số nguyên tố Giả sử n là một số tự nhiên, việc giải quyết bài toán này yêu cầu thời gian đa thức Hiện nay, các máy tính hiện đại vẫn chưa có khả năng giải quyết bài toán phân tích số nguyên tố trong thời gian thực.
Cho p, q là hai số nguyên tố khác nhau và n = p.q khi đó (n) = (p-1)(q-1) Lấy a thuộc Z (n) sao cho a khả nghịch Giả sử b = a -1 mod (n) a/ Định nghĩa:
Bộ các số (n, p, q, a, b) trong đó n, p, q, a, b đƣợc đề cập ở trên đƣợc gọi là bộ số RSA
Ta có tính chất quan trọng sau đây của bộ số RSA b/ Định lý:
Nếu (n, p, q, a, b) là các bộ số RSA thì x Z n ta có: x ab mod n = x c/ Ứng dụng:
Cho bộ số RSA (n, p, q, a, b), x Z n Đặt y = x b mod n Khi đó ta có cách tìm x từ y bởi công thức: x = y a mod n Từ đó đƣa ra định nghĩa hệ mã hoá RSA
2.1.3.3 Định nghĩa hệ mã hoá RSA Định nghĩa:
Chọn bộ số RSA (n, p, q, a, b) với p, q là các số nguyên tố có kích thước 512 bit hoặc lớn hơn Hệ mã hóa RSA sử dụng khóa K = (n, p, q, a, b) cho phép mã hóa và giải mã trong không gian P = C = Z n, với các quy tắc mã hóa và giải mã cụ thể như sau.
Qui tắc mã hóa: với mỗi x P = Z n e k : Z n Z n x y = x b mod n
Qui tắc giải mã: d k : Z n Z n y x = y a mod n Trong đó: (n, b) là thành phần khóa công khai (p, q, a) là thành phần khóa bí mật
CÁC CHUẨN KỸ THUẬT TRONG PKCS
PKCS, viết tắt của Public Key Cryptography Standards, là một bộ tiêu chuẩn trong mã hóa công khai, bao gồm từ PKCS#1 đến PKCS#15 Bộ tiêu chuẩn này được phát triển bởi phòng thí nghiệm RSA (RSA Laboratories), thuộc Tổ chức an toàn dữ liệu RSA (RSA Data Security Inc), với sự hợp tác của nhiều nhà phát triển hệ thống an ninh Mục tiêu của PKCS là thúc đẩy việc triển khai nhanh chóng các ứng dụng mã hóa khóa phi đối xứng.
Chuẩn PKCS#1 v2.1 được công bố bởi phòng thí nghiệm RSA trong tài liệu "PKCS#1 v2.1: RSA Cryptography Standard" vào ngày 14/6/2002, nhằm đưa ra các khuyến nghị cho việc triển khai hệ mã hóa công khai dựa trên thuật toán RSA.
Chuẩn PKCS#1 v2.1 đề cập tới các vấn đề cơ bản sau:
+ Các cơ sở của hệ mã hoá + Lƣợc đồ mã hóa
Lược đồ chữ ký số và cú pháp ASN.1 được sử dụng để biểu diễn khóa và nhận dạng lược đồ Điểm mới trong PKCS#1 v2.1 so với các phiên bản trước là việc áp dụng thuật toán RSA – đa nguyên tố (Multi prime RSA) và lược đồ chữ ký RSASSA – PSS Trong RSA – đa nguyên tố, modulo RSA n được thể hiện là tích của nhiều hơn hai số nguyên tố, khác với các phiên bản trước chỉ sử dụng tích của hai số nguyên tố n = p.q.
2.2.2 Các ký hiệu trong PKCS#1 v2.1 c Biểu diễn bản mã dạng số nguyên, 0 c n – 1 (là đầu ra của cơ sở mã hóa RSAEP và là đầu vào của cơ sở giải mã RSADP)
C bản mã là chuỗi octet, kết quả từ quá trình mã hóa RSAES – OAEP – DECRYPT Số mũ RSA bí mật d được sử dụng cho giải mã, với d_i là số mũ CRT của r_i, thỏa mãn điều kiện e.d_i ≡ 1 (mod (r_i - 1)) và d_i < r_i – 1, với i = 3, , u d_P là số mũ CRT của p, là số nguyên dương thỏa mãn e.d_P ≡ 1 (mod (p – 1)) và d_P < p – 1 Tương tự, d_Q là số mũ CRT của q, thỏa mãn e.d_Q ≡ 1 (mod (q – 1)) và d_Q < q – 1 e là số mũ RSA công khai, sử dụng trong quá trình mã hóa.
Thông điệp EM đã được mã hóa là một chuỗi octet, được tạo ra từ quá trình áp dụng phương thức độn EME – OAEP lên thông điệp M Chiều dài của thông điệp mã hóa EM được tính theo số bit, ký hiệu là emBit, trong khi chiều dài tính theo số octet được ký hiệu là emLen GCD( , ) là ký hiệu cho WCLN của hai số nguyên không âm.
Hash hàm băm bảo mật hLen chiều dài đầu ra, tính theo octet của hàm băm Hash k chiều dài tính theo số octet của modulo RSA n
L nhãn sử dụng trong RSAES – OAEP, một chuỗi octet LCM ( , … , ) bội chung nhỏ nhất của các số nguyên không âm
M biểu diễn thông điệp (bản rõ) dạng số nguyên, 0 m n – 1 (là đầu vào của cơ sở mã hóa RSAEP, và là đầu ra của cơ sở giải mã RSADP)
Thông điệp M là một chuỗi octet, được sử dụng trong hoạt động mã hóa RSAES – OAEP – ENCRYPT và giải mã RSAES – OAEP – DECRYPT Mask đầu ra của hàm sinh mặt nạ MGF có chiều dài maskLen tính theo octet, với mgfSeed là hạt giống để tạo ra mặt nạ Thông điệp M có chiều dài mLen tính theo số octet, và n là modulo RSA, với n = r1 r2 r3 ru, trong đó u là số lượng thừa số nguyên tố Khóa công khai RSA được xác định bởi p và q, là hai thừa số nguyên tố đầu tiên của n qInv là hệ số CRT của p, là một số nguyên dương nhỏ hơn p và thỏa mãn điều kiện q qInv ≡ 1 (mod p) Các thừa số nguyên tố r_i của n bao gồm r1 = p, r2 = q và có thể có các thừa số khác t_i là hệ số CRT của thừa số nguyên tố r_i, là một số nguyên dương nhỏ hơn r_i và thỏa mãn điều kiện r1 r2.
… r i-1 t i 1 (mod r i ), t i < r i , I = 3, … , u u số các thừa số nguyên tố của modunlo RSA, u 2 x một số nguyên không âm
X một chuỗi octet tương ứng với x xLen chiều dài tính theo octet của xâu X (n) LCM (r 1 – 1, r 2 – 1, … , r u - 1) phép XOR bit trên 2 chuỗi octet
hàm sàn; x là số nguyên nhỏ nhất, lớn hơn hoặc bằng số thực x
|| toán tử nối các chuỗi octet kí hiệu đồng dƣ, a b (mod n) có nghĩa là (a – b) n
Ghi chú: thuật ngữ octet có ý nghĩa tương đương với byte (8 - bit)
Trong hệ mật RSA, có hai loại khóa chính được sử dụng: khóa bí mật và khóa công Những loại khóa này được định nghĩa trong tài liệu PKCS#1 v2.1 và đóng vai trò quan trọng trong các cơ sở và lược đồ mã hóa.
Một khóa công khai RSA bao gồm hai thành phần:
+ n modulo RSA, một số nguyên dương + e số mũ công khai RSA, một số nguyên dương Trong một khóa công khai RSA hợp lệ thì:
+ Modulo RSA n là tích của u số nguyên tố lẻ phân biệt r i , i = 1, 2, 3, ,u; u 2 + số mũ công khai RSA e là số nguyên thỏa 3 e n – 1, UCLN(e, (n)) = 1
Có thể sử dụng một trong hai cách biểu diễn khóa bí mật RSA
Dạng 1: theo cách biểu diễn này thì một khóa bí mật RSA bao gồm hai thành phần:
+ n modulo RSA, một số nguyên dương + d số mũ bí mật RSA, một số nguyên dương
Dạng 2: trong cách biểu diễn này thì một khóa bí mật RSA bao gồm một bộ năm số (p, q, dP, dQ, qInv) và các bộ ba (khuyết nếu u = 2) (r i , d i , t i ) Ý nghĩa của các thành phần nhƣ sau:
Trong bài viết này, chúng ta sẽ khám phá các thành phần quan trọng liên quan đến thừa số nguyên tố của một số nguyên n, bao gồm p là thừa số nguyên tố đầu tiên, q là thừa số nguyên tố thứ hai, dP là số mũ CRT của thừa số p, dQ là số mũ CRT của thừa số q, và qInv là hệ số CRT đầu tiên Những yếu tố này đóng vai trò quan trọng trong việc phân tích và hiểu sâu hơn về cấu trúc số nguyên.
+ r i thừa số nguyên tố thứ i + d i số mũ CRT của thừa số nguyên tố thứ i + t i hệ số CRT của thừa số thứ i
Trong một khóa bí mật RSA hợp lệ ở dạng biểu diễn thứ nhất thì:
+ n mang ý nghĩa nhƣ trong khóa công khai RSA
+ d số mũ bí mật RSA, là một số nguyên dương nhỏ hơn n và thỏa mãn e.d
1 (mod ( (n)) Trong đó e là số mũ công khai RSA, và (n) đã đƣợc định nghĩa trong mục 3.2
Một khóa bí mật RSA hợp lệ ở dạng biểu diễn thứ hai thì phải thỏa mãn:
Trong hệ thống mã hóa RSA, p và q là hai thừa số nguyên tố đầu tiên của modulo n Các số mũ CRT dP và dQ là những số nguyên dương nhỏ hơn p và q, lần lượt thỏa mãn điều kiện e.dP ≡ 1 (mod (p – 1)) và e.dQ ≡ 1 (mod (q – 1)) Hệ số CRT đầu tiên, qInv, là một số nguyên dương nhỏ hơn p, thỏa mãn điều kiện q.qInv ≡ 1 (mod p).
+ Nếu u > 2 thì trong khóa bí mật RSA dạng hai bao gồm các bộ ba (r i , d i , t i ), I
= 3, 4, … u.trong đó r i là thừa số nguyên tố thứ I của modulo RSA n Với số mũ CRT d I (i = 3, 4,…,u) phải thỏa mãn e.d i 1 (mod(r i – 1)), d i < r i Mỗi hệ số CRT t i (i = 3, 4,
…, u) là một số nguyên dương nhỏ hơn r i và thỏa mãn R i t i 1 (mod r i ), R i = r 1 r 2 r i-1
2.2.4 Cơ sở chuyển đổi dữ liệu I2OSP và OS2IP
Có hai kiểu cơ sở chuyển đổi dữ liệu đƣợc sử dụng trong PKCS#1 v2.1:
+ I2OSP: Integer – to – Octet – String Primitive: chuyển đổi từ dạng số nguyên sang chuỗi octet
+ OS2IP: Octet – String – to – Integer Primitive: chuyển đổi từ dạng chuỗi octet sang dạng số nguyên
Các cơ sở chuyển đổi dữ liệu đóng vai trò quan trọng trong lược đồ mã hóa RSAES – OAEP Về mặt toán học, I2OSP và OS2IP là hai ánh xạ ngược nhau, cho phép chuyển đổi giữa các chuỗi octet và số nguyên Việc thực hiện chuyển đổi này là cần thiết, vì đầu vào và đầu ra của quy trình mã hóa và giải mã chủ yếu là chuỗi octet, trong khi thuật toán RSA chỉ hoạt động với các số nguyên.
Để đảm bảo tính an toàn của thuật toán RSA, cần xử lý các số nguyên rất lớn, vượt quá khả năng biểu diễn của một từ máy Do đó, việc biểu diễn số nguyên trong một cấu trúc dữ liệu là cần thiết, và các cơ sở chuyển đổi dữ liệu sẽ hoạt động trên chuỗi octet cùng với cấu trúc dữ liệu này.
Một chuỗi octet là một dãy tuần tự gồm các octet, với mỗi octet tương ứng với một byte Dãy tuần tự này được đánh dấu chỉ mục từ octet đầu tiên (bên trái) cho đến octet cuối cùng (bên phải).
2.2.4.1 Chuyển đổi dữ liệu I2OSP
I2OSP chuyển đổi một số nguyên không âm về dạng một chuỗi octet với độ dài được chỉ định trước
Hàm I2OSP (x, xLen) nhận đầu vào là số nguyên không âm x và chiều dài xLen, sau đó chuyển đổi x thành chuỗi octet Kết quả trả về là chuỗi octet X tương ứng với chiều dài xLen.
Lỗi: “số nguyên quá lớn”
1 Nếu x 256 xLen , ra “số nguyên quá lớn” và kết thúc
CHUẨN MÃ HÓA DỮ LIỆU TIÊN TIẾN – AES
Thuật toán RSA chậm hơn đáng kể so với các thuật toán mã hóa khóa đối xứng như DES và AES do phải xử lý các số nguyên lớn Vì lý do này, RSA thường không được sử dụng để mã hóa và giải mã trực tiếp các thông điệp dài Thay vào đó, RSA thường được kết hợp với một thuật toán mã hóa đối xứng, trong đó DES hoặc AES được sử dụng để mã hóa trực tiếp thông điệp, và RSA được dùng để mã hóa khóa bí mật của các thuật toán này.
Chúng tôi sẽ áp dụng thuật toán RSA đa nguyên tố kết hợp với AES để phát triển một ứng dụng Để thực hiện điều này, việc nghiên cứu và hiểu rõ lý thuyết về chuẩn mã hóa tiên tiến AES là rất quan trọng.
Hình 2.7: Sơ đồ kết hợp RSA và AES
Plaintext ASE Encryption Ciphertex ASE Decryption Plaintext
AES, or Advanced Encryption Standard, is a widely used encryption algorithm designed to protect electronic data and has been adopted by the U.S government as its encryption standard, replacing the older DES Officially published by NIST in FIPS PUB 197 on November 21, 2001, AES was developed by Belgian cryptographers Joan Daemen and Vincent Rijmen, and is collectively known as Rijndael.
Thuật toán mã hóa AES, với các biến thể như AES-128, AES-192 và AES-256, được phân loại theo chiều dài khóa sử dụng Hiện nay, AES-128 là phiên bản phổ biến nhất trong các giao dịch điện tử Bài viết này sẽ tập trung vào việc cài đặt và ứng dụng của thuật toán AES-128, và khi đề cập đến thuật toán AES, chúng ta sẽ hiểu là AES-128.
2.3.3 Các khái niệm cơ sở
Đầu vào, đầu ra và khóa trong thuật toán AES đều là các chuỗi 128 bit, tương đương với 16 byte, thường được gọi là một khối (block) Chiều dài chuỗi được xác định bởi số bit chứa trong nó Các bit trong chuỗi được đánh số từ 0, bắt đầu từ bit đầu tiên đến bit cuối cùng Nếu i là chỉ số cho một bit trong khối 128, thì i nằm trong khoảng từ 0 đến 127.
2.3.3.2 Byte Đơn vị cơ sở đƣợc xử lý trong thuật toán AES là byte Input, output, key đều đƣợc xử lý nhƣ mảng một chiều 16 byte Các byte cũng đƣợc đánh số thứu tự bắt đầu từ 0 cho byte đầu tiên Nếu n là chỉ số cho một byte nào đó, thì n nằm trong khoảng: 0 n 16 Các mảng 16 byte được biểu diễn (ký hiệu) dưới dạng sau: a 0 a 1 a 2 a 15
Mỗi byte được cấu thành từ 8 bit, thường được biểu diễn dưới dạng {b7, b6, b5, b4, b3, b2, b1, b0}, trong đó mỗi bit bi có giá trị 0 hoặc 1 Một byte tương ứng với một đa thức nhị phân, với bậc cao nhất không vượt quá 7, được biểu diễn bằng công thức: b7 x 7 + b6 x 6 + b5 x 5 + b4 x 4 + b3 x 3 + b2 x 2 + b1 x + b0.
Theo cách biểu diễn này, ta thấy sự tương ứng này là 1 – 1 giữa các byte trong tập 256 byte và các phần tử của trường hữu hạn GF(2 8 )
Ví dụ: {01100011} được biểu diễn dưới dạng x 6 + x 5 + x + 1
Cơ số 16 (hexadecimal) có thể được sử dụng bằng cách chia byte thành hai phần, mỗi phần gồm 4 bit, với mỗi nhóm 4 bit được thay thế bằng một ký tự Ví dụ, chuỗi nhị phân 01100011 có thể được biểu diễn dưới dạng {63} Việc thay thế này dựa trên Bảng 2.1.
Bit Pattern Character Bit Pattern Character
Bảng 2.1: Thay thế dãy 4 bit sang cơ số 16
Trong một số toán tử của trường hữu hạn, việc thêm một bit (b8) vào bên trái của một byte (8 bit) là cần thiết Khi có bit mở rộng này, byte 9 bit được biểu diễn bằng cách thêm {01} trước byte 8 bit Ví dụ: {01} {1b}.
2.3.3.3 Ma trận trạng thái (State Matrix)
Thuật toán AES sử dụng một tập hợp các toán tử để thực hiện và biến đổi một ma trận hai chiều gọi là ma trận trạng thái Ma trận trạng thái có kích thước 4x4 và chứa dữ liệu cần mã hóa.
Quy trình mã hóa AES bắt đầu bằng cách nạp 16 byte dữ liệu vào ma trận trạng thái, thiết lập trạng thái ban đầu Sau đó, các toán tử được áp dụng lên ma trận trạng thái, sử dụng khóa mật AES, bao gồm 44 khóa con được sinh ra từ khóa ban đầu 16 byte, mỗi khóa con có kích thước 4 byte Cuối cùng, trạng thái cuối cùng của ma trận trạng thái sẽ được chuyển vào output, trong khi quá trình giải mã thực hiện ngược lại.
Ta giả sử Input = in 0 , in 1 , in 2 ,… in 15 Khi đó ta có trạng thái khởi đầu ma trận trạng thái: n 0 n 4 n 8 n 12 n 1 n 5 n 9 n 13 n 2 n 6 n 10 n 14
2.3.3.4 Hộp thay thế S – Box và InvS – Box
S-Box là một bảng 16x16 chứa các byte, trong đó các cột và dòng được đánh số từ 0 đến f Khi đầu vào là một byte được biểu diễn dưới dạng {x, y} theo hệ thập lục phân, đầu ra của S-Box sẽ là byte nằm ở vị trí giao nhau giữa dòng x và cột y trong bảng.
Tương ứng với bảng S – Box có bảng InvS – Box thỏa mãn:
InvS – Box(S – Box(b)) = b, trong đó b là một byte bất kỳ
InvS – Box được sử dụng cho quá trình giải mã Dưới đây là hai bảng S – Box và InvS – Box đƣợc sử dụng:
Hình 2.8: Hộp S –Box sử dụng trong quá trình mã hoá AES [14]
Hình 2.9: Hộp InvS –Box sử dụng trong quá trình mã hoá AES [14]
Trong hoạt động mã hóa cũng nhƣ giải mã AES, có 4 toán tử cơ bản đƣợc sử dụng để thao tác trên byte
Thay thế các byte trong ma trận trạng thái bằng cách sử dụng bảng thay thế S-Box Dịch chuyển các dòng của ma trận trạng thái với các đoạn khác nhau trên mỗi dòng Trộn dữ liệu trong mỗi cột của ma trận trạng thái đã được thay thế bằng S-Box Cuối cùng, thực hiện phép cộng (XOR) giữa một Round Key và ma trận trạng thái.
Ban đầu khóa K = k 0 k 1 …k 15 (16 byte) đƣợc đƣa vào Từ khóa K sinh ra 44 khóa con W[0], W[1], … W[43], với mỗi khóa còn là một word 4 byte
Quy tắc sinh 44 khóa con nhƣ sau:
Với 4 khóa con đầu tiên:
W[i-4] XOR SubWord(RotWord(W[i-1])) XOR Rcon[i/4]
Trong đó SubWord(x: word) tác động S – Box lên từng byte trong word RotWord(x: word) thực hiện dịch trái một byte trên x
Rcon[1 10] là bảng các hằng word:
Sau khi dữ liệu từ Input được nạp vào ma trận trạng thái, quá trình mã hóa bắt đầu với sự tham gia của bốn hàm thao tác và biến đổi ma trận trạng thái.
+ SubBytes(): thay thế tất cả các phần từ (byte) của ma trận trạng thái bằng việc áp dụng S – Box lên phần tử đó
+ ShiftRows(): hoán vị vòng dòng thứ i của ma trận trạng thái về bên trái i bước, mỗi bước dịch 1 byte
Hàm MixColumns() thực hiện phép nhân giữa ma trận cố định và ma trận trạng thái, sử dụng các phép toán cộng và nhân byte đã được định nghĩa trong mục 2.4.3.
+ AddRoudKey(): Tác động vào ma trận trạng thái 11 vòng (r = 0, 1, …,
PHƯƠNG PHÁP NÉN DỮ LIỆU
TỔNG QUAN VỀ NÉN DỮ LIỆU
3.1.1.1 Nén dữ liệu, bít trung bình
1/ Nén dữ liệu a/ Khái niệm nén dữ liệu
Nén là quá trình giảm không gian cần thiết để biểu diễn thông tin, chuyển đổi luồng ký hiệu thành luồng từ mã.
Quá trình nén nhƣ sau:
Hình 3.1: Quá trình nén dữ liệu
Văn bản là văn bản ban đầu cần nén
Mô hình là tập hợp các chữ cái và quy tắc xử lý chúng để tạo ra từ mã Nó xác định xác suất xuất hiện của từng chữ cái, từ đó một bộ mã sẽ tạo ra các từ mã dựa trên xác suất này.
Mã hoá là chỉ quá trình thay thế các chữ cái trong văn bản ban đầu bằng các từ mã tương ứng để đưa ra bản mã chính xác
Quá trình nén diễn ra bằng cách mô hình hóa văn bản cần nén để tạo ra các từ mã Sau khi có bộ từ mã, quá trình nén sẽ sử dụng chúng cùng với văn bản ban đầu để tạo ra bản mã cuối cùng.
Mã hoá và mô hình là hai giai đoạn khác biệt, trong đó giai đoạn mô hình cung cấp nhiều phương pháp để xử lý các ký tự trong văn bản Mặc dù vậy, cả hai giai đoạn đều sử dụng một phương pháp xây dựng mã chung để tạo ra các từ mã.
Nếu bản mã có kích thước nhỏ hơn văn bản thì phương pháp nén đó có hiệu quả
Chúng ta sử dụng cùng phương pháp mã Huffman cho hai mô hình khác nhau:
Mô hình 1: dựa trên xác suất độc lập của từng chữ cái xuất hiện bất kì trong văn bản
Mô hình 2: cần tính đƣợc xác suất phụ thuộc dựa trên những chữ cái nhận đƣợc lúc đó trong văn bản
Do mô hình khác nhau nên cùng sử dụng mã Huffman để đƣa ra từ mã nhƣng hiệu quả nén của chúng rất khác nhau
Mặc dù thuật ngữ "mã hoá" thường được sử dụng để chỉ toàn bộ quy trình nén văn bản, thực tế đây chỉ là một giai đoạn trong quá trình nén.
Người ta thường mã hoá thông qua các từ mã của một bảng chữ cái nào đó
Có nhiều thuật toán nén dữ liệu khác nhau, mỗi thuật toán phù hợp với một kiểu dữ liệu nhất định Một số modem có khả năng nén thích ứng, cho phép chọn thuật toán nén phù hợp dựa trên kiểu dữ liệu cần nén Trong số các phương pháp mã hóa, phương pháp nào có mã ngắn hơn sẽ được coi là nén tốt hơn so với các phương pháp khác.
Chúng ta thường sử dụng trình nén để giảm kích thước các file, đặc biệt là các văn bản có dung lượng từ 256 byte Khi nén một file nhiều lần liên tiếp, sẽ đến một thời điểm mà trình nén không thể thu nhỏ file đó thêm nữa Điều này xảy ra vì nếu không, chúng ta sẽ nén file xuống đến mức không còn dữ liệu nào.
Từ đó, có thể khẳng định rằng với mọi thuật toán mã hóa, luôn tồn tại một văn bản mà không thể nén thành file có dung lượng nhỏ hơn.
Không thể xác định rạch ròi ranh giới giữa mã hoá và mã nén Để đánh giá khả năng nén của thuật toán, ta sử dụng khái niệm về số bít trung bình cần thiết để lưu trữ một ký tự trong văn bản.
3.1.1.2 Mã tổng và mã phân tách 1/ Mã tổng Định nghĩa Văn bản tổng
Cho A và B là hai văn bản riêng biệt Khi kết hợp A và B, ta tạo ra một văn bản mới bằng cách viết B tiếp theo bên phải A Do đó, độ dài của văn bản tổng hợp sẽ bằng tổng độ dài của A và B.
Hình 3.2: Văn bản tổng Định nghĩa Mã tổng
Một mã đƣợc gọi là mã tổng nếu nhƣ bản mã của tổng các văn bản là tổng các bản mã
Trong định nghĩa mã tổng, chúng ta sử dụng khái niệm "tổng của các văn bản" Nếu mã của văn bản "a" là f(a) và mã của văn bản "b" là f(b), thì mã của văn bản "ab" được xác định theo quy tắc tổng hợp các mã này.
“f(a)f(b)”, bản mã của “ba” là “f(b)f(a)”
Mã tổng trên bảng chữ cái Σ = {a1, a2, , am} được xác định với mỗi chữ cái ai có từ mã tương ứng Từ mã này tạo ra ánh xạ f: Σ → M, chuyển đổi các chữ cái thành các xâu bít "0/1" Do đó, với mọi ai thuộc Σ, xâu bít f(ai) chính là từ mã của ai, và độ dài của xâu bít f(ai) được ký hiệu là (ai).
Theo định nghĩa mã tổng thì xâu các chữ cái = 1 2 n tương ứng duy nhất với xâu bít có dạng f( ) = f( 1 )f( 2 ) f( n ) Bản mã f( ) có độ dài L( )= n i i
Trong bài viết này, chúng ta sẽ chỉ tập trung vào các mã tổng nhị phân Khi các từ mã có độ dài cố định, việc giải mã luôn khả thi Tuy nhiên, với những từ mã có độ dài thay đổi, không phải tất cả các phương pháp mã hóa đều cho phép giải mã thành công.
Xét cách mã sau: a -> 100 b -> 1000 c -> 0 Bản mã của “ac” và b đều là dãy bít “1000” Nhƣ vậy khi nhận đƣợc chuỗi bít
Trong quá trình tạo mã, điều quan trọng là xác định rõ ràng các thành phần cơ bản, bao gồm từ mã, từ bản mã nhận được Để đảm bảo tính chính xác và duy nhất trong việc tách rời các thành phần này, cần có những điều kiện nhất định Tính phân tách sẽ được trình bày dưới đây nhằm đảm bảo rằng chúng ta có thể xác định được văn bản ban đầu là “b” hay “ac”.
Cùng một dữ liệu có thể được mã hoá theo nhiều phương pháp khác nhau, trong đó có những phương pháp cho phép tạo ra bản mã ngắn hơn.
MÔ HÌNH THỐNG KÊ
Mô hình thống kê tĩnh đơn giản nhất là bảng tĩnh liệt kê các giá trị xác suất theo cách tính thông thường Trước đây, việc phân tích và xây dựng mã Huffman rất tốn thời gian, dẫn đến việc chỉ phân tích một lần cho các dữ liệu điển hình nhằm tạo ra bảng đếm số lần xuất hiện của từng ký hiệu Dựa trên kết quả này, một cây mã Huffman tĩnh được xây dựng và lưu trữ để sử dụng nhiều lần.
Mô hình nhƣ vậy đƣợc gọi là mô hình thống kê tĩnh (Static Statiscal Model)
Việc áp dụng một mô hình tĩnh vạn năng cho nhiều kiểu dữ liệu có những hạn chế rõ ràng Khi dữ liệu đầu vào không phù hợp với mô hình, hiệu quả nén sẽ giảm, thậm chí kích thước dữ liệu nén có thể lớn hơn dữ liệu đầu vào (gọi là nở đầu vào) Do đó, một giải pháp cải tiến là phát triển mô hình tĩnh chuyên biệt cho từng loại dữ liệu khác nhau.
Việc xây dựng mô hình tĩnh riêng mang lại hiệu suất nén cao, nhưng cần lưu trữ thêm dữ liệu cho cấu trúc cây mã trước khi lưu bản mã Nếu kích thước cây mã chỉ khoảng 256B so với dữ liệu cần nén vài trăm KB, mô hình này sẽ hiệu quả Tuy nhiên, khi kích thước cây mã tăng lên khoảng 64KB, mô hình tĩnh riêng trở nên không phù hợp với mục tiêu nén dữ liệu.
3.2.2 Mô hình thống kê động Để khắc phục những nhƣợc điểm của mô hình thống kê tĩnh, mô hình thống kê động ra đời với số liệu thống kê đối với dữ liệu cần mã hoá không phải lưu trữ trước mà liên tục đƣợc tích luỹ và sửa đổi trong suốt quá trình mã hoá và giải mã
Hình 3.4: Mã hoá theo mô hình thống kê động Đọc ký hiệu Mã hoá ký hiệu Xuất từ mã
Mô hình Cập nhật mô hình
Các ký hiệu Các từ mã
Khối cập nhật mô hình trong sơ đồ giải mã hoá theo mô hình thống kê động cần hoạt động chính xác trong cả quá trình mã hoá và giải mã Khi một ký hiệu hoặc nhóm ký hiệu được nhập vào, nó sẽ được mã hoá dựa trên mô hình hiện tại, sau đó mô hình sẽ được cập nhật Tương tự, khi một từ mã được đọc vào, nó sẽ được giải mã theo mô hình hiện tại và sau đó mô hình cũng sẽ được cập nhật dựa trên ký hiệu đã được giải mã.
Mô hình thống kê động ban đầu không có thông tin về dữ liệu cần mã hóa, vì vậy hiệu ứng nén chưa thể hiện rõ Hiệu ứng nén chỉ trở nên rõ ràng khi làm việc với hàng nghìn ký hiệu Một trong những ưu điểm của mô hình động là khả năng thích ứng với nhiều loại dữ liệu khác nhau.
3.2.3 Một số mã nén cơ bản
Kỹ thuật mã hoá Shannon – Fano, ra đời vào cuối những năm 1940, là một trong những thuật toán nén đầu tiên nhằm giảm không gian cần thiết để biểu diễn thông tin Kỹ thuật này không chỉ đáp ứng nhu cầu của các nhà sản xuất viễn thông thời bấy giờ mà còn giúp giảm thời gian truyền số liệu và chi phí.
Mã Shannon và Fano được phát triển độc lập nhưng đều dựa trên nguyên tắc rằng độ dài từ mã tỷ lệ nghịch với xác suất xuất hiện của chúng Vì các ký tự trong văn bản có xác suất xuất hiện khác nhau, việc sử dụng các từ mã ngắn cho các ký tự có xác suất cao sẽ giảm tổng số ký tự cần mã hóa, từ đó nâng cao tính kinh tế trong quá trình mã hóa.
Mô hình Cập nhật mô hình
Các từ mã Các ký hiệu
1/ Mã Fano a/ Thuật toán tạo mã Fano nhƣ sau:
Giả sử a i với i = 1 n là các chữ cái của một bảng chữ cái nào đó và a i xuất hiện với xác suất tương ứng là p i Chú ý p 1 + p 2 + + p n = 1
Bước 1: Bằng cách sắp xếp và ký hiệu lại chúng ta có thể coi các chữ cái a 1 , a 2 , , a n có xác suất là p 1 p 2 p n (theo thứ tự giảm dần)
Bước 2: Chia các chữ cái thành hai nửa, nửa trên và nửa dưới, với tổng số lượng gần bằng nhau nhất Nửa trên được gán mã là 0, trong khi nửa dưới được gán mã là 1.
Lặp lại quy trình cho từng nửa cho đến khi mỗi nửa chỉ còn lại một chữ cái Dãy số 0 và 1 được tạo ra sẽ trở thành mã cho các chữ cái.
Không gian xác suất các sự kiện {e, a, i, o, u, h } với xác suất tương ứng là e - 0.3, a - 0.2, i – 0.2, o – 0.1, u – 0.1, h – 0.1
Quá trình tạo mã theo thuật toán Fanno đƣợc mô tả nhƣ sau: e – 0.3
Hình 3.6: Quá trình tạo mã Fanno
Khi xem xét ví dụ, ta nhận thấy rằng ký tự có xác suất lớn hơn thường đi kèm với mã ngắn hơn Điều này không chỉ giúp quá trình mã hóa văn bản trở nên ngắn gọn hơn mà còn nâng cao hiệu quả nén dữ liệu.
Việc tạo mã theo thuật toán Fano cũng đảm bảo cho mã có tính phân tách, do đó có thể mã hoá và việc giải mã là duy nhất
Mã nén Shannon, tương tự như mã Fano, áp dụng nguyên tắc rằng độ dài của mã tỷ lệ nghịch với xác suất xuất hiện của các ký tự trong văn bản.
Xét bảng chữ cái Σ = {a 1 , a 2 , , a m } với xác suất tương ứng là p 1 p 2 p m > 0 a/ Biểu diễn nhị phân của các số nhỏ hơn 1
Với mỗi p i có thể chỉ ra số nguyên r i sao cho 1
Một số x < 1 bất kỳ có thể biểu diễn duy nhất ở dạng x =
1 k k , trong đó i là các số hoặc bằng 0 hoặc bằng 1
Chúng ta sử dụng ký hiệu 0, i 2 3 k để ghi lại tổng trên và gọi nó là biểu diễn nhị phân của số x Nhƣ vậy, số có dạng 0.11 có nghĩa là
Trong phần này, để đơn giản hóa và tránh nhầm lẫn, chúng ta sẽ loại bỏ “0” khỏi biểu diễn và vẫn gọi các số 1, 2, 3, , k là biểu diễn nhị phân của x Bên cạnh đó, khái niệm mã Shannon cũng sẽ được đề cập.
Xét các số Q 1 < Q 2 < < Q m được biểu diễn dưới dạng nhị phân, chúng ta giữ lại từng dãy cơ số 2 tương ứng với mỗi Q i từ r i số đầu tiên Như vậy, ta có m dãy i với i = 1 m được tạo ra từ các bít 0/1 Đối với mỗi i = 1 m, khi sử dụng i để mã hoá trạng thái a i, chúng ta thu được một phương pháp mã nhị phân, trong đó mỗi trạng thái a i tương ứng với một dãy có r i bít.
Loại mã này chúng ta gọi là mã Shannon c/ Thuật toán tạo mã Shannon
Bước 1: Liệt kê các chữ cái a i của văn bản cần mã hoá có xác suất p i theo thứ tự giảm dần
Bước 2: Ứng với mỗi chữ cái a i và xác suất xuất hiện tương ứng p i ta tính Q i nhƣ sau: Q i = p 1 + p 2 + … + p i-1
Bước 3: Đổi các số thập phân p i và Q i ra dạng biểu diễn nhị phân
Bước 4: Tính r i theo điều kiện 1
Trong bài viết này, chúng ta sẽ khám phá vị trí đầu tiên khác 0 sau dấu phẩy của các xác suất p i được biểu diễn dưới dạng cơ số 2 Mỗi mã tương ứng sẽ được ký hiệu bằng r i, lấy từ phần thập phân của số nhị phân Q i.
Tạo mã cho 10 chữ cái với tần xuất trong 852 phép thử là: a 200; b 150; c 130; d 120; e 100; f 70; g 50; h 20; i 10; j 2 Thực hiện theo các bước của thuật toán
Tần suất Xác suất (cơ số 10) Xác suất
(cơ số 2) Độ dài từ mã
Bảng 3.1: Ví dụ mã nén Shannon
Ta nhận thấy rằng trong bộ mã tạo ra không có từ mã nào là bắt đầu của từ mã kia Do đó đây là mã phân tách
MÔ HÌNH TỪ ĐIỂN
Các mô hình thống kê mã hóa và giải mã từng ký hiệu, trong khi các mô hình từ điển hoạt động theo cơ chế khác biệt Chúng tiếp nhận dữ liệu, sau đó tìm kiếm nhóm ký hiệu tương ứng trong từ điển Nếu nhóm ký hiệu được tìm thấy, chúng sẽ xuất ra một con trỏ đến nhóm đó thay vì cung cấp một từ mã như mô hình thống kê.
Hiệu quả nén dữ liệu cao hơn khi dữ liệu vào tương hợp tốt với nhóm ký hiệu trong từ điển Trong mô hình từ điển, phương pháp nén không phải là yếu tố quan trọng nhất; điều cốt lõi là tập trung vào việc xây dựng mô hình phù hợp.
Một từ điển tĩnh hoạt động như một danh sách tài liệu tham khảo trong khoa học, nơi các tác giả thường thay thế sách tham khảo bằng một con số trong ngoặc vuông Con số này dẫn đến một cuốn sách hoặc bài báo trong danh sách tài liệu tham khảo, giúp rút ngắn nội dung bài viết thay vì phải liệt kê đầy đủ tiêu đề của từng tài liệu.
Mô hình từ điển tĩnh gặp phải những nhƣợc điểm tương tự như mô hình thống kê tĩnh, khi yêu cầu từ điển phải được phát đi trước khi dữ liệu được mã hoá, dẫn đến giảm hiệu quả nén Để khắc phục nhƣợc điểm này, việc sử dụng từ điển động là cần thiết, tương tự như cách viết tắt trong sách báo Khi một cụm từ lần đầu xuất hiện, nó sẽ được kèm theo kí tự viết tắt trong cặp ngoặc đơn, giúp tối ưu hóa quy trình mã hoá.
Nén dữ liệu là quá trình dự đoán chính xác ký hiệu tiếp theo sẽ xuất hiện, ví dụ như trong tiếng Việt, sau chữ "q" chỉ có thể là "u", và sau "qu" có thể là "y, a, e, i, ê, â, ă" Nếu chúng ta có thể dự đoán chính xác hoàn toàn ký hiệu tiếp theo, thì không cần lưu trữ ký hiệu đó Khả năng dự đoán này dựa vào tính luật và sự phụ thuộc, trong đó entropy là thước đo cho sự phụ thuộc này Entropy càng nhỏ thì khả năng nén văn bản càng lớn.
Tính entropy, tức là tìm ra lƣợng tin Đối với một quyển truyện thì lƣợng tin phân bố theo các tầng kiến tạo tin sau đây:
Phân tích chi tiết tầng từ ngữ bao gồm các lớp phụ thuộc như chữ cái, quy tắc tạo từ, câu, đoạn văn và chương Để tính toán lượng thông tin trong văn bản một cách hiệu quả, cần có thuật toán phân tích để tìm ra mô hình phụ thuộc phân tầng Tuy nhiên, việc này rất khó khăn, do đó, người ta thường phát triển thuật toán nén dựa trên những lý giải hợp lý.
Khi dự đoán, chúng ta thường dựa vào những sự kiện trong quá khứ, cho phép chúng ta tính toán và dự báo những gì sẽ xảy ra tiếp theo Việc này dẫn đến việc không cần thiết phải tính toán các thông số cho thuật toán nén Tư duy được hình thành thông qua các khái niệm, và những khái niệm này được thể hiện qua ngôn ngữ, tạo ra nhiều từ và cụm từ lặp lại trong giao tiếp Do đó, thay vì ghi nhận khái niệm một cách trực tiếp, người ta thường mô tả từ hoặc cụm từ dựa trên vị trí mà chúng đã xuất hiện trước đó.
Nguyên lý LZ, viết tắt của Ziv-Lempel, được phát triển bởi Jacob Ziv và Abraham Lempel vào năm 1977, là một phương pháp nén dữ liệu hiệu quả Nguyên lý này thay thế một từ hoặc cụm từ bằng vị trí của từ hoặc cụm từ giống hệt đã xuất hiện trước đó, giúp giảm kích thước dữ liệu mà vẫn giữ nguyên nội dung.
Nguyên lý LZ dựa trên nhận xét rằng ngôn ngữ hàng ngày chứa nhiều từ và cụm từ lặp lại Quyển truyện càng dày, số lượng từ và cụm từ càng nhiều Do đó, việc mô tả từ hay cụm từ theo vị trí trong một quyển truyện trở thành cơ sở để xây dựng từ điển.
Phương pháp mã hoá LZ cho phép nén dữ liệu hiệu quả ở tầng từ ngữ, tuy nhiên, nó không thể áp dụng cho các tầng cao hơn.
Triết lý Quan niệm Ý tưởng tác giả Nội dung câu chuyện Tình tiết diễn biến Nhân vật của câu chuyện
Từ ngữ Đoạn Câu Cụm từ
Dựa vào từ điển, một văn bản có thể phân thành nhiều cụm từ, với văn bản được mã hóa thành tọa độ của các cụm từ và độ dài tương ứng Điều quan trọng là lựa chọn một từ điển chất lượng và đảm bảo tìm được cụm từ dài nhất có thể Các thuật toán LZ sử dụng từ điển với những đặc điểm nhất định để tối ưu hóa quá trình mã hóa.
Từ điển có thể tĩnh hoặc động
Từ điển đƣợc xây dựng tuỳ thuộc vào từng văn bản cụ thể
2/ Mã với từ điển tĩnh
Mã từ điển tĩnh là phương pháp ký hiệu có hệ thống cho tất cả các đoạn copy Ví dụ, tác phẩm "Truyện Kiều" của Nguyễn Du có thể được coi như một từ điển, trong đó mỗi câu đều mang ý nghĩa riêng và góp phần vào tổng thể của tác phẩm.
“Sè sè nấm đất ven đường Rầu rầu ngọn cỏ nửa vầng nửa xanh”
Trong truyện Kiều, có một phần nhấn mạnh rằng “đất ven đường được ưu tiên để trồng cây…” Thay vì trích dẫn nguyên đoạn văn, chúng ta chỉ cần ghi lại tọa độ của nó trong từ điển Nếu tọa độ của đoạn này là từ số 1156 đến 1158, ta có thể ghi nhận văn bản là “11561158 được ưu tiên để trồng cây…”.
Một văn bản có thể được chia thành các đoạn copy, tương ứng với các toạ độ xác định trong truyện Kiều Truyện Kiều không chỉ giúp cắt văn bản thành các đoạn copy mà còn cho phép chúng ta ký hiệu các đoạn này bằng các con số toạ độ Nhờ vào các con số này, chúng ta có thể tái tạo lại văn bản ban đầu từ truyện Kiều Quá trình này được gọi là quá trình chuyển đổi văn bản.
“số hoá” văn bản hay là tra từ điển
Mã với từ điển động cho phép nén hiệu quả hơn khi độ dài đoạn copy lớn Để giải mã văn bản, chúng ta cần cả bản mã và từ điển, nhưng việc lưu giữ từ điển lớn cùng với bản mã nén có thể tốn kém, đôi khi tổng dung lượng vượt quá dung lượng văn bản gốc Do đó, mã nén LZ động sử dụng chính văn bản cần nén làm từ điển Khi nén đến ký tự thứ m, chúng ta có thể tận dụng toàn bộ quá khứ của văn bản làm từ điển, giúp tiết kiệm dung lượng lưu trữ mà vẫn đảm bảo quá trình mã hóa và giải mã hiệu quả.
4/ Quá trình thực hiện khi nén bằng mã LZ
Hình 3.10: Quá trình thực hiện nén bằn mã LZ
Quá trình đƣợc tiến hành qua 3 giai đoạn:
PHỐI HỢP HAI PHƯƠNG PHÁP NÉN VÀ MÃ HOÁ THÔNG TIN
MÔ HÌNH PHỐI HỢP HAI PHƯƠNG PHÁP NÉN VÀ MÃ HOÁ THÔNG TIN 80
Trong các chương trước, chúng ta đã khám phá nhiều phương pháp nén và mã hóa thông tin Hiện nay, có nhiều kỹ thuật nén và mã hóa khác nhau đang được sử dụng phổ biến, với những cải tiến đáng kể trong hiệu suất và độ an toàn của chúng.
Để đảm bảo an ninh và lưu trữ hiệu quả, cần phối hợp hợp lý giữa hai phương pháp nén và mã hoá dữ liệu Một câu hỏi quan trọng là nên thực hiện nén dữ liệu trước hay mã hoá trước Để trả lời câu hỏi này, cần làm rõ các vấn đề liên quan đến quy trình và hiệu quả của từng phương pháp.
+ Vấn đề không gian lưu trữ + Vấn đề an toàn thông tin + Vấn đề thời gian xử lý dữ liệu
4.1.1 Về không gian lưu trữ
Lưu trữ dữ liệu đã trải qua một giai đoạn tăng trưởng mạnh mẽ trong những năm gần đây Sự gia tăng mật độ lưu trữ diễn ra theo cấp số nhân, dẫn đến giảm chi phí cho mỗi đơn vị lưu trữ.
Mặc dù GB đã liên tục giảm, nhưng khả năng lưu trữ dữ liệu hiện có không theo kịp với nhu cầu ngày càng tăng Điều này đã khiến bộ phận CNTT phải nỗ lực tối đa hóa việc sử dụng các hệ thống lưu trữ dữ liệu hiện tại.
Trong lĩnh vực sao lưu, giải pháp cho mật độ lưu trữ và an ninh bao gồm việc sử dụng kỹ thuật nén phần mềm để giảm dung lượng lưu trữ và mã hóa để bảo vệ dữ liệu trên kênh truyền Sao lưu thường được thực hiện offline, nhưng hiện nay, mã hóa và nén cũng được áp dụng cho lưu trữ trực tuyến.
Các phương pháp nén dữ liệu chủ yếu dựa vào việc loại bỏ các phần dư thừa trong tập dữ liệu Quá trình này thường bao gồm việc xác định các mẫu dữ liệu lặp lại, giữ lại một ví dụ cho mỗi mẫu và thay thế các bản sao bằng các ký hiệu trong bản nén Ngược lại, mã hóa tốt sẽ làm cho dữ liệu đầu vào, đặc biệt là phần dư thừa, trở nên ngẫu nhiên, từ đó loại bỏ mọi dư thừa và mẫu lặp lại Kết quả là dữ liệu đã được mã hóa sẽ không thể nén thêm Do đó, khi thực hiện cả hai quy trình mã hóa và nén, việc nén cần được thực hiện trước khi mã hóa.
Hình 4.1 : Luồng xử lý nén và mã hoá
Nén dữ liệu có thể làm giảm hiệu quả của một số cuộc tấn công tệp nén bằng cách giảm sự dư thừa trong dữ liệu Một phương pháp giải mã phổ biến là phân tích bản mã, tập trung vào việc tìm kiếm dữ liệu lặp lại Khi tệp tin được nén, phương pháp tấn công này sẽ trở nên kém hiệu quả hơn.
Các cuộc tấn công bạo lực sẽ tốn nhiều thời gian để thử nghiệm các khóa khác nhau nhằm giải mã dữ liệu, vì chúng phải kiểm tra ý nghĩa của dữ liệu đầu ra Nếu dữ liệu được nén trước khi mã hóa, kẻ tấn công sẽ phải giải mã và sau đó giải nén để lấy lại bản rõ ban đầu Do đó, một cuộc tấn công sẽ không thành công nếu kẻ tấn công không biết chính xác rằng dữ liệu đã được nén và phương pháp nén được sử dụng.
Một thực nghiệm đã được tiến hành để mã hoá tin nhắn ngắn bằng ngôn ngữ lập trình Python, sử dụng phương pháp mã hoá AES – 128 bit và tấn công bạo lực, với 1000 lần thử nghiệm cho mỗi chiều dài mật khẩu Thí nghiệm sau đó được lặp lại với phương pháp nén trước khi mã hoá, và kết quả thu được đã được ghi nhận.
Chiều dài mật khẩu Nén Không đƣợc nén
Như có thể thấy, nếu nén trước khi mã hóa mất khoảng 9 lần thời gian để giải mã so với dữ liệu không đƣợc nén
4.1.3 Vấn đề thời gian xử lý dữ liệu
Các phương pháp mã hóa hiện nay thường tạo ra tệp tin nén có kích thước lớn hơn so với tệp tin gốc Hơn nữa, dữ liệu ngẫu nhiên cũng làm tăng thời gian nén tệp tin.
Nén dữ liệu trước khi mã hóa giúp giảm kích thước tệp tin bằng cách loại bỏ các dữ liệu trùng lặp, từ đó giảm đáng kể thời gian mã hóa so với việc nén tệp tin sau khi mã hóa.
Mô hình phối hợp hai phương pháp nén và mã hoá dữ liệu
Nhƣ đã trình bày trong mục 4.1.1 quá trình nén và mã hoá sẽ đƣợc thự hiện nhƣ hình 4.2
Hình 4.2: Mô hình phối hợp hai phương pháp nén và mã hoá thông tin
Plain text data Compressor Compressed file Encryption
- Plain text là bản rõ ban đầu
- Compressor là quá trình nén nén bản rõ thành tệp tin nén Compressed file bằng một trong các phương pháp nén Huffman, LZW…
- Encryption là quá trình mã hoá tệp tin nén Compressed file bằng các thuật toán AES hoặc DES để cho ra bản mã Ciphertex
- Decryption giải mã tệp Ciphertex để có đƣợc tệp Compressed file
- Decompressor: quá trình giải nén Compressed file thành bản rõ ban đầu
Quá trình mã hoá và giải mã tệp tin diễn ra như một song ánh, trong đó tệp tin gốc được nén bằng các phương pháp như Shannon, Huffman hoặc LZW Việc nén này giúp tạo ra bản nén có kích thước nhỏ hơn, loại bỏ yếu tố trùng lặp, từ đó tạo ra dữ liệu lý tưởng cho các thuật toán mã hoá.
Quá trình giải mã tệp tin bắt đầu bằng việc áp dụng giải thuật giải mã để khôi phục bản tin nén trước khi mã hóa, sau đó thực hiện giải nén để lấy lại tệp tin gốc.
Mô phỏng quá trình trên áp dụng cho tệp Vidu.txt nội dung
Hình 4.3: Nội dung tệp bản rõ
Sau khi nén bằng thuật toán LZW thu đƣợc tệp tin Compress.dat nhƣ sau:
Hình 4.4: Nén tệp bằng phương pháp LZW
Sau đó mã hoá bằng thuật toán AES với khoá là: “Đại học công nghệ” tệp tin cuối code.txt nhƣ sau:
Hình 4.5: Mã hoá tệp sau khi nén bằng LZW
Quá trình giải nén bắt đầu từ tệp tin Code.dat, được giải mã bằng khoá “Đại học công nghệ”, để tạo ra tệp tin Compress.dat Sau khi hoàn tất, tệp tin ban đầu sẽ được phục hồi.
Ví dụ trên cho thấy rằng, ngay cả khi kẻ thám mã thành công trong việc giải mã tệp code.dat, họ vẫn chưa chắc chắn về nội dung thực sự do tệp Compress.dat không mang lại thông tin hữu ích Việc xác định nội dung bản rõ sẽ trở nên khó khăn hơn trong quá trình tấn công Để minh họa cho điều này, chúng ta có thể áp dụng phương pháp mã hóa trước và nén sau.
- Với khoá: “Đại học công nghệ” áp dụng thuật toán AES cho tệp Vidu.txt ta có tệp tin code.txt
Hình 4.6: Mã hoá tệp bản rõ bằng phương pháp AES
- Sau đó áp dụng thuật toán mã hoá LZW trên tệp code.dat ta có tệp tin Compress.dat nhƣ sau
Hình 4.7: Nén tệp sau khi đã mã hoá bằng AES
Tệp tin compress.dat khi được nén trước khi mã hóa có kích thước nhỏ hơn nhiều so với tệp tin compress.dat được nén sau khi mã hóa.
CHƯƠNG TRÌNH THỬ NGHIỆM
Để gửi file đã nén và mã hóa, người dùng cần kèm theo file bản mã của khóa AES đã sử dụng để mã hóa tệp tin nén Khi nhận tệp tin nén, người nhận cần thực hiện các bước để giải mã và truy cập nội dung.
- Dùng khoá bí mật RSA của mình để giải mã khoá AES nhận đƣợc
- Dùng khoá AES để giải mã tệp tin nén
- Ý tưởng cài đặt chương trình cho qui trình trên như sau:
Khi tiến hành mã hóa, chương trình yêu cầu file bản rõ, khóa AES và khóa RSA làm tham số đầu vào Khóa AES sẽ được mã hóa bằng thuật toán RSA và lưu vào một tệp riêng Cuối cùng, tệp tin nén sau khi mã hóa sẽ được lưu trữ trên một tệp cuối.
Chương trình giải mã sử dụng bản mã của khoá AES, khoá bí mật RSA và tệp nén làm tham số đầu vào Đầu tiên, chương trình đọc bản mã của khoá AES để giải mã và lấy khoá Sau đó, khoá này được sử dụng để giải mã tệp cuối Cuối cùng, tệp sau khi được giải mã sẽ được giải nén để khôi phục tệp tin ban đầu.
Ngôn ngữ lập trình C# là một ngôn ngữ lập trình hướng đối tượng hiện đại, mạnh mẽ và linh hoạt, được phát triển bởi Microsoft C# kết hợp sức mạnh của C và C++ với tính dễ sử dụng tương tự như Visual Basic, mang lại cho lập trình viên một công cụ hiệu quả để phát triển ứng dụng.
C# là ngôn ngữ lập trình hướng đối tượng, cho phép viết mã nguồn trong các lớp, nơi chứa các phương thức thành viên Các lớp và phương thức này có thể tái sử dụng trong các ứng dụng hoặc chương trình khác Bằng cách truyền thông tin vào các lớp và phương thức, chúng ta có thể tạo ra mã nguồn tái sử dụng một cách hiệu quả.
C# trong hệ thống Visual Studio.Net được hỗ trợ mạnh mẽ bởi thư viện đồ sộ NetFrameWork của Microsoft, điều này lý giải vì sao C# được chọn để cài đặt chương trình Demo cho luận văn này.
Chương trình hỗ trợ nén và mã hóa nhiều loại tệp khác nhau như văn bản (.doc, xls, ppt, txt), hình ảnh (bitmap, JPG) và video Mỗi loại tệp có định dạng và cấu trúc riêng, do đó quá trình giải mã và giải nén không chỉ cần giữ nguyên nội dung mà còn phải đảm bảo tính toàn vẹn về định dạng và cấu trúc của tệp gốc.
1 Xây dựng lớp ConvertStringTobyte.cs gồm các phương thức:
Hàm readfileTostring cho phép đọc tệp có định dạng tùy ý và trả về một chuỗi ký tự Quá trình này diễn ra bằng cách đọc từng bit, sau đó chuyển đổi dãy bit thành dãy số nguyên, và cuối cùng chuyển các số nguyên này thành ký tự để ghép lại thành một chuỗi hoàn chỉnh.
- Createfile : Từ xâu ký tự ghi thành tệp gốc (giữ nguyên nội dung và cấu trúc)
Chuyển mỗi ký tự trong xâu thành một số nguyên, đổi các số nguyên thành các bit sau đó ghi tệp theo các bit
+ Input: xâu ký tự, đường dẫn + Output: tệp văn bản
2 Nén dữ liệu bằng phương pháp LZW (Lempel - Zip - Welch) – Xây dựng lớp LZW.cs a Nén dữ liệu:
Input: đường dẫn tệp tin cần nén Output: Tệp tin đã nén (với tên: tên file gốc + phần mở rộng lzw)
Tệp tin nén sẽ đƣợc đặt cùng thƣ mục với tệp tin gốc
Trong quá trình nén sử dụng một bảng băm để lưu từ điển nén theo thuật toán LZW đã trình bày trong phần 3.3.2.2 mục 3 b Giải nén dữ liệu:
+ Input: đường dẫn tệp cần tin nén;
+ Output: tệp tin giải nén (có tên: tên của tập tin ban đầu)
Tệp tin giải nén được lưu trữ trong cùng thư mục với tệp tin nén Quá trình giải nén dựa vào từ điển được xây dựng từ văn bản đã xử lý, và tần suất xuất hiện của từ trong bản nén ảnh hưởng lớn đến hiệu quả nén Để khắc phục nhược điểm này, phương pháp nén theo mô hình thống kê được áp dụng, trong đó từ xuất hiện nhiều lần được mã hóa bằng từ mã ngắn hơn Sau khi xây dựng từ điển và bản mã, cần thực hiện kiểm tra lại số lần lặp lại của các từ mã và điều chỉnh thứ tự từ điển, đồng thời thay thế các từ mã trong bản nén Trước khi thực hiện các thay đổi, cần sử dụng mảng để lưu lại ánh xạ giữa từ mã cũ và từ mã mới.
Quá trình giải nén không ghi ngay các ký tự ra tệp tin mà lưu chúng thành một xâu Sau đó, xâu ký tự này được chuyển đổi thành dạng bit để ghi vào tệp, đảm bảo đúng cấu trúc ban đầu.
3 Nén bằng phương pháp GZIP – Xây dựng lớp: Gzip.cs
- Sử dụng thƣ viện có sẵn của C#.Net: System.Io.Compression
- Sử dụng lớp có sẵn trong thư viện: Gzipstream gồm hai phương thức CompressMode và DecompressMode
To compress a file in C#, specify the input file path and the output file path for the compressed file The output file will be named with the original file name followed by the gzip extension Use the `Compress` method, which creates a `FileStream` for the output file in write mode Then, initialize a `GZipStream` with the output stream and set it to compress mode Open the input file with a `FileStream` in read mode, read its contents into a buffer, and write the buffer to the `GZipStream` to complete the compression process.
- Nhƣ đã trình bày trong phần mở đầu 4.3.2.2 nội dung tệp tin nén sẽ đƣợc chuyển thành một mảng số nguyên (byte) trước khi áp dụng giải thuật nén
- Tệp tin nén đƣợc đặt trong cùng thƣ mục với tệp tin ban đầu
To decompress a file, first specify the input compressed file path and the output destination for the decompressed file Use the FileStream class to open the input file for reading and create a new output file for writing Then, utilize the GZipStream class to decompress the data from the input stream Finally, write the decompressed data to the output file using the Write method.
4 Huffman – xây dựng hai lớp: HuffmanTree.cs và Node.cs a Lớp HuffmanTree.cs
Trong phương thức sử dụng kiểu từ điển để lưu trữ các kí tự có trong xâu cùng với số lần xuất hiện của kí tự đó trong xâu
Xây dựng các cây con từ danh sách kí từ vừa lưu trữ trong từ điển Xây dựng cây nhị phân đầy đủ từ các cây con
Phương thức: BitArray Encode (string);
Mã hóa chuỗi ký tự chuyển đổi thành một dãy bit nhị phân, sử dụng phương thức Traverse(char symbol, List data) từ lớp Node Để hoàn thành quá trình mã hóa, cần chuyển đổi dãy bit trở lại thành chuỗi ký tự và lưu trữ vào file nén.
Phương thức String Decode (BitArray);
Từ dãy bit giải mã về xâu kí tự sử dụng cây nhị phân đã xây dựng b Node.cs
Gồm có các thuộc tính: char Symbol: ký tự của node int Frequency: trọng số của node Node Right: cây con trái
Node Left: cây con phải Phương thức: Traverse(char symbol, List data): trả về dãy bit để mã hoá ký tự symbol
This method employs a recursive technique to identify the bit sequence that encodes the desired character When traversing the left subtree, if it is not null, a new list of boolean values is created, and the current path is updated by adding a false value Similarly, for the right subtree, if it exists, a separate list is initialized, and the existing data is extended accordingly.
5 Mã hoá tệp tin (AES Encryption)
- Thuật toán mã hoá AES đƣợc đặt trong lớp AES.cs
- Trong C# Net có thƣ viện System.Security.Cryptography; hỗ trợ mã hoá tệp tin bằng thuật toán AES a Mã hoá - thủ tục Encrypt
Để chuyển đổi một chuỗi thành dãy byte cho phép mật hóa đối xứng, phương thức PasswordDeriveBytes được sử dụng Mặc dù có nhiều kỹ thuật khác để thực hiện điều này, nhưng chúng thường không đủ bảo mật do độ dài và sự hạn chế của các ký tự trong password Để nâng cao độ bảo mật, có thể sử dụng một giá trị chuỗi làm seed cho một bộ sinh số ngẫu nhiên, tạo ra dãy byte an toàn hơn cho khóa Khi khởi tạo đối tượng PasswordDeriveBytes, cần cung cấp password và giá trị salt, là một dãy byte ngẫu nhiên kết hợp với password để sinh ra khóa Việc sử dụng giá trị salt khác 0 giúp chống lại các cuộc tấn công từ điển, vì kẻ tấn công phải tìm ra giá trị salt trước khi tạo danh sách khóa để giải mã dữ liệu.
Quá trình mã hoá gồm các bước:
Tạo khoá hợp lệ cho quá trình mã hoá:
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] {0x00, 0x01, 0x02, 0x1C, 0x1D, 0x1E, 0x03, 0x04, 0x05, 0x0F, 0x20, 0x21, 0xAD, 0xAF, 0xA4});
Chuyển văn bản mã hoá về dãy byte byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(Data);