So sánh mã khối và mã dòng

Mã hóa là là nhu cầu quan trọng trong cuộc sống của con người và là khái niệm trung tâm của An toàn thông tin. Nói đơn giản, mã hóa là làm sao để trao đổi thông tin giữa 2 bên mà không bị người thứ 3 biết được nội dung.

Thời kỳ chiến tranh chính là lúc mà nhu cầu mã hóa thông tin trở nên cấp thiết nhất, nếu các thông tin mật bị kẻ thù giải mã được thì đó sẽ là thảm họa. Do vậy mà thời chiến cũng là thời kỳ bùng nổ của các lý thuyết về mã hóa. Trong chiến tranh thế giới thứ 2, phe Đồng Minh nhờ việc giải mã được cỗ máy mã hóa Enigma của quân Đức mà khiến cho chiến tranh rút ngắn khoảng 2 năm. Đức không thua sao được khi mà các thông tin quân sự mật đều bị phe Đồng Minh giải mã dễ dàng.

Bạn đọc có thể đọc thêm về cuộc đời của Alan Turing, hoặc xem bộ phim The Imitation Game để hiểu thêm về cuộc chiến này dưới góc nhìn mật mã học.


Sơ đồ hệ thống mật mã

Một sơ đồ hệ thống mật mã gồm có năm thành phần:

S = (P, C, K, E, D)

Trong đó:

  • P là một tập hữu hạn các ký tự của bản rõ.
  • C là một tập hữu hạn các ký tự của bản mã.
  • K là một tập hữu hạn các khóa.
  • E là hàm lập mã.
  • D là hàm giải mã.

Như vậy: c = E(p, k)p = D(c, k') với c ⊂ C; p ⊂ P và k, k' ⊂ K

Đồng thời 2 hàm E và D phải thỏa mãn hệ thức D(E(c, k), k') = c (đồng nghĩa với việc có thể giải mã được).

Các tập ký tự bản rõ và bản mã thường dùng là tập 26 kí tự tiếng Anh, khi đó

P = C = {a,b,c,...,x,y,z}

hoặc có thể chuyển đổi tương đương thành tập các số nguyên để thuận tiện cho tính toán:

P = C = Z26 = {0,1,2,...,23,24,25}

Ta có thể tạm chia các hệ mã hóa thành 3 loại: Mật mã khóa đối xứng, mật mã khóa bất đối xứng, và mã hóa một chiều.


Mật mã khóa đối xứng

Mã hóa đối xứng nghĩa là chìa khóa để lập mã và chìa khóa giải mã là một.

2 bên A và B muốn trao đổi thông tin với nhau, trước tiên sẽ thống nhất phương pháp lập mã và giải mã, tức là hàm E và hàm D đã biết (thường thì người thứ 3 cũng sẽ biết được 2 hàm E và D). Thứ cần giữ bí mật chính là khóa k, và khóa k này được dùng cho cả hàm E và hàm D để lập mã và giải mã. k là private key.

Đa số các loại mật mã truyền thống đều là mã hóa đối xứng.

Đơn giản nhất là mã Caesar hay mã chuyển dịch. Từng kí tự trong bản mã sẽ được dịch chuyển về phía sau k bước trong tập {a,b,c,…x,y,z} tạo nên bản mã. Để giải mã, ta làm người lại, dịch chuyển từng kí tự của bản mã về phía trước k bước. Như vậy k chính là chìa khóa cần giữ bí mật.

Vd: với `c = E(p, k)`3, bản rõ HELLO sẽ được mã hóa thành JGNNQ.

Ngoài ra còn các loại mật mã truyền thống khác như: mã thay thế, mã Affin, mã Vigenere, mã Hill, mã hoán vị, … hay các hệ mật mã hiện đại như mã DES, mã 3-DES, mã AES, …


Mật mã khóa bất đối xứng

Mã hóa bất đối xứng nghĩa là chìa khóa mã hóa k và chìa khóa giải mã `c = E(p, k)`5 là hoàn toàn khác nhau. Khóa K sẽ bao gồm 2 thành phần `c = E(p, k)`6

Tương tự mã hóa đối xứng, hàm E và hàm D sẽ được thống nhất trước và công khai, tuy nhiên điểm khác là khóa k cũng được công khai, vì nếu không có khóa c = E(p, k)`5 người thứ 3 sẽ không thể giải mã được dù cho có biết `k. k là public key và `c = E(p, k)`5 là private key. Cũng chính vì thế mà mật mã khóa bất đối xứng còn được gọi là mật mã có khóa công khai.

Khái niệm mật mã khóa công khai mới được ra đời vào giữa những năm 1970, và ngay sau đó đã trở thành một khái niệm trung tâm của khoa học mật mã hiện đại.

Một số hệ mật mã khóa công khai phổ biến là: hệ RSA, hệ Rabin, hệ ElGamal, …


Mã hóa một chiều

Đôi khi ta lại chỉ cần mã hóa mà không cần giải mã, khi đó ta sẽ dùng phương pháp mã hóa một chiều. Thông thường phương pháp mã hóa 1 chiều sử dụng 1 hàm băm (hash function) để cho ra kết quả là một chuỗi hash có độ dài cố định.

Đặc điểm của hàm băm là có thể nhận vào 1 chuỗi có độ dày thay đổi nhưng kết quả trả về lại có độ dài cố định. Và việc giải mã chuỗi hash để tìm lại thông tin ban đầu là không thể. 2 chuỗi giống nhau khi đưa vào hàm băm sẽ cho ra cùng một chuỗi hash. 2 chuỗi chỉ khác biệt đôi chút khi đưa vào hàm băm lại trở nên hoàn toàn khác biệt.

Vậy tại sao lại cần mã hóa một chiều, có thể bạn sẽ thắc mắc mã hóa mà không giải mã được thì mã hóa làm gì?

Hãy tưởng tượng bạn viết 1 ứng dụng, và cần lưu mật khẩu đăng nhập của người dùng, nhưng nếu mã hóa mật khẩu theo kiểu mã hóa đối xứng hay bất đối xứng thì bạn vẫn sẽ phải lưu khóa k ở đâu đó. Nguy cơ sẽ bị hacker giải mã nếu hack vào cơ sở dữ liệu của chương trình và lấy được khóa k. Vậy ta sẽ dùng hàm băm để biến mật khẩu thành 1 chuỗi hash và lưu trữ chuỗi hash này. Sau đó, khi người dùng đăng nhập bằng password, ta sẽ biến password này thành chuỗi hash rồi so sánh với chuỗi hash đã lưu trữ để xác thực đăng nhập. Trong trường hợp này, cho dù hacker có chiếm được cơ sở dữ liệu và biết chuỗi hash của password đã lưu thì cũng không thể nào biết được password thực sự là gì.

Các hệ mã hóa một chiều phổ biến là: MD5 và SHA.

Ok, bạn đã thấy ứng dụng của mã hóa một chiều rồi đấy, ngoài ra nó còn ứng dụng trong kiểm tra tính toàn vẹn dữ liệu với 1 nguyên lý tương tự.


Mã hóa theo khối và mã hóa theo dòng

Ngoài cách chia 3 loại mã hóa như trên người ta còn chia các hệ mật mã thành 2 loại: mã hóa theo khối (block cipher) và mã hóa theo dòng (stream cipher).

Mã hóa theo khối

Mã hóa theo khối (block cipher) nghĩa là ta sẽ chia bản mã thành từng khối có độ dài bằng nhau và bằng `p = D(c, k')`4 (có thể chia thành khối 64 bit, 128 bit, … hoặc đơn giản là khối 3 kí tự, 4 kí tự, …) rồi áp dụng phép lập mã và giải mã đối với từng khối thông tin. Mã Caesar là trường hợp đặc biệt mà `p = D(c, k')`5, tức là ta mã hóa từng kí tự một. Mã hoán vị là ví dụ về mã theo khối với `p = D(c, k')`6.

Các hệ mã khối nổi tiếng đó là DES có kích thước khối là 64 bit (tức là mỗi lần mã hóa một khối bản rõ 64 bit và cho ra khối bản mã 64 bit) và kích thước khóa là 56 bit; AES có kích thước khối là 128 bit, và kích thước khóa là 128, 192 hoặc 256 bit.

Mã hóa theo dòng

Với các hệ mã dòng (stream cipher), ta sẽ xử lý trên từng bit của bản rõ. Một hệ mã dòng rất nổi tiếng đó là One Time Pad (OTP). Với bản rõ p = D(c, k')`7 và khóa `k có cùng độ dài theo bit, One-Time-Pad được xác định như sau:

`p = D(c, k')`9

`c ⊂ C; p ⊂ P và k, k' ⊂ K`0

Với OTP, khóa k phải đáp ứng 3 điều kiện sau đây:

  • Độ dài của khóa phải bằng kích thước bản rõ.
  • Khóa phải được chọn hoàn toàn ngẫu nhiên (truly random)
  • Và khóa chỉ được sử dụng một lần.

Nếu thỏa mãn 3 điều kiện trên, hệ mã OTP sẽ là an toàn tuyệt đối (perfect security) theo định lý của Clause Shannon, tức là kẻ tấn công sẽ không thể biết được thông tin gì của bản rõ m chỉ từ bản mã c.

Trong thực tế, người ta thường chọn ngẫu nhiên một khóa k có độ dài nhỏ hơn rất nhiều so với bản rõ, và dùng một hàm tạo số ngẫu nhiên (Pseudo Random Generator – PRG) để mở rộng độ dài của khóa k đó. Vì vậy, biến thể của OTP được dùng trong thực tế như sau:

`c ⊂ C; p ⊂ P và k, k' ⊂ K`3

`c ⊂ C; p ⊂ P và k, k' ⊂ K`4


Thám mã

Cần phân biệt giữa thám mã với giải mã. Giải mã là khi ta đã biết hàm D và khóa k, dễ dàng tìm lại được bản rõ. Còn thám mã là các phương pháp để tìm lại bản rõ khi không biết k. Nói cách khác, thám mã là bài toán tìm khóa mã k

Thám mã được chia làm các loại:

  • Thám mã chỉ biết bản mã: người thám mã chỉ biết 1 bản mật mã C.
  • Thám mã khi biết cả bản rõ: người thám mã biết 1 bản rõ P và bản mã C tương ứng.
  • Thám mã khi có bản rõ được chọn: người thám mã có thể chọn bản rõ P và biết được bản mã C tương ứng. Điều này xảy ra khi người thám mã chiếm được máy lập mã.
  • Thám mã khi có bản mã được chọn: người thám mã có thể chọn bản mã C và biết được bản rõ P tương ứng. Điều này xảy ra khi người thám mã chiếm được máy giải mã.

Hy vọng qua bài viết này người đọc sẽ có cái nhìn tổng quan về mật mã học và các loại mật mã. Các bài tiếp theo tôi sẽ trình bày từng hệ mật mã cụ thể cùng với đó là hướng dẫn viết code mã hóa và thám mã cho các hệ mật mã này.