Ghi chép về mã hóa 1

Ghi chép về mã hóa 1

(Mọi bản ghi chép công bố trên blog này đều là ghi chép cá nhân nhặt nhạnh trên Internet để tìm hiểu sâu hơn đôi chút một vấn đề. Thông tin trong đó có thể sai theo hiểu biết hạn chế của tác giả.)

1-Mã hóa là gì

Xét ví dụ một bảng mã hóa (mật mã) đơn giản, các chữ cái chuyển thành một cặp số (cột,hàng):

1

2

3

4

5

1

A

B

C

D

E

2

F

G

H

I/J

K

3

L

M

N

O

P

4

Q

R

S

T

U

5

V

W

X

Y

Z

Theo bảng này, từ “TAN CONG” sẽ được mã hóa (encryption) là: 44 11 33 31 43 33 22

Người không có bảng mã trên, đọc hàng số đó sẽ không hiểu gì. Người có bảng mã sẽ giải mã (decryption) được hàng số đó thành từ “tan cong”. Bảng mã nói trên là một dạng thuật toán mã hóa.

Mã hóa là việc dùng một thuật toán mã hóa và một hoặc nhiều khóa mã biến đổi thông tin có nghĩa (plaintext) thành chuỗi ký tự vô nghĩa (ciphertext – mật mã). Chỉ những người biết thuật toán và có khóa mã mới giải mã thông tin đã mã hóa thành thông tin có nghĩa.

Hệ thống mã hóa: gồm thuật toán (hàm toán học) để mã hóa, các khóa mã và các thủ tục (protocol) để thực hiện quá trình mã hóa.

Mã hóa “mạnh” và “yếu”: mã hóa được chia thành 2 loại. Mã hóa yếu chỉ có mục đích hạn chế người bình thường không đọc được nội dung, mã hóa mạnh thì ngay cả các siêu máy tính có thể phải mất hàng chục năm hay lâu hơn mới phá mã được nếu không có khóa mã.

2-Mã hóa dùng một khóa mã bí mật (symmetric key techniques)

Trong kỹ thuật mã hóa này, người gửi và người nhận thông tin có cùng một khóa mã duy nhất. Người gửi dùng khóa mã, mã hóa thông tin rồi gửi đi. Người nhận dùng cũng khóa mã đó để giải mã thông tin và đọc.

Vì chỉ có một khóa mã và dùng chung nên kỹ thuật mã này còn có nhiều tên khác nhau như : symmetric-key, secret-key, single-key, shared-key, one-key, và private-key

Hình 2.1: Mã hóa dùng một khóa mã bí mật

Loại khóa này tương tự như những khóa thông thường chỉ có một chìa. Chỉ có thể đóng, mở khóa bằng những chìa giống hệt nhau.

Chuẩn mã hóa quốc gia đầu tiên của Mỹ (và cũng được sử dụng rộng rãi trên toàn thế giới) là DES (Data Encryption Standard) dùng khóa mã đối xứng dài 56 bit. Sau khi được công bố năm 1976, đến năm 1999 mật mã này bị phá trong 22 giờ 15 phút, dùng cách vét cạn (brute force): dò thử tất cả 70,000,000,000,000,000 tổ hợp ký tự của khóa 56 bit.

Về nguyên tắc để dò một số lượng lớn khóa mã như vậy phải có một siêu máy tính cực nhanh. Tuy nhiên năm 1997, dự án DESCHALL Project dùng thời gian rỗi của hàng nghìn máy tính trên Internet đã phá được DES, dành giải thưởng $10,000 của RSA Security .

Hiện nay, DES được coi là không đủ an toàn và thay bằng AES (Advanced Encryption Standard) công bố năm 2002 với khóa mã dài 128, 192 hoặc 256 bit. Ngoài ra còn các chuẩn mã hóa một khóa khác như Twofish, Serpent, AES (Rijndael), Blowfish, CAST5, RC4, TDES, IDEA.

Ưu nhược điểm: nhanh, rất phù hợp nếu thông tin mã hóa không phải chuyển đi đâu (chỉ dùng cho một người).

Nếu thông tin mã hóa phải chuyển qua mạng cho một người thứ hai đọc, nhất là trên khoảng cách xa, khó khăn chính là phải chuyển được khóa mã cho người nhận một cách bí mật (phân phối khóa). Nếu trong quá trình chuyển khóa mã, một bên thứ ba có thể sao chép được khóa mã đó thì họ cũng có thể chặn bắt thông tin đã mã hóa và dùng khóa mã giải mã dễ dàng.

3-Mã hóa dùng hai khóa mã: khóa mã công khai và khóa mã bí mật. (asymmetric key techniques)

Để tránh được nhược điểm về phân phối khóa nói trên người ta dùng phương thức mã hóa có hai khóa mã (còn gọi là mã hóa không đối xứng) mới xuất hiện năm 1975.

Loại mã hóa này có hai khóa mã: một khóa mã công khai (public key) dùng để mã hóa và một khóa bí mật (private key) dùng giải mã.

Xét ví dụ tương tự: A định gửi một bức thư mật cho B. Các bước tiến hành như sau:

  • A yêu cầu B gửi chìa khóa công khai của B đến cho A. Vì là chìa công khai nên B có thể gửi qua bưu điện, nhờ người khác, thậm chí treo ở một nơi công cộng v.v… mà không cần giữ bí mật.

  • A viết thư, bỏ vào một cái hòm có hai chìa khóa khác nhau. Chìa công khai của B được dùng để khóa hòm đó lại rồi hòm được gửi qua bưu điện.

  • Chìa công khai của B, ai cũng có thể có một bản sao nhưng chìa công khai chỉ dùng để khóa, không dùng mở được. Do đó trên đường vận chuyển, người thứ ba không mở được.

  • B nhận được hòm, dùng chìa khóa bí mật của B để mở hòm. Khi đã khóa bằng chìa công khai của B thì chỉ có thể mở được bằng chìa bí mật của B, người khác không có chìa bí mật này không thể mở được.

Hình 3.1: Mã hóa dùng khóa công khai và khóa bí mật

Điểm hay của cách làm này là cái khóa mã công khai không cần dấu diếm. Cách làm tương tự khi muốn nhận email bí mật như sau:

  • B dùng phần mềm tạo ra một bộ khóa mã riêng cho mình gồm một khóa công khai (public key) và một khóa bí mật (private key). Bộ khóa mã này gắn liền với một địa chỉ email của B.

  • Khóa bí mật được cất giữ cẩn thận trên máy tính của B. Khóa công khai có thể gửi kèm theo email cho A hoặc gửi vào một máy chủ công cộng trên Internet kèm theo địa chỉ email, bất kỳ ai muốn gửi mật thư cho B đều có thể vào máy chủ đó tải bản sao khóa công khai của B về.

  • Người gửi (A) soạn thư, dùng khóa mã công khai của B để mã hóa bức thư đó rồi gửi cho B. Trên đường truyền dù có ai chặn xem thư cũng không thể đọc được vì thư đã bị mã hóa, không có khóa bí mật không giải mã được.

  • Khi thư đến máy tính của người nhận (B), người nhận dùng khóa mã bí mật và phần mềm giải mã để giải mã bức thư.

Cách mã hóa này có hai ưu điểm:

  • Hai người trao đổi thông tin mật cho nhau không cần có thỏa thuận trước. Nếu một người có địa chỉ email kèm một khóa công khai gửi trên một máy chủ Internet, bất kỳ người nào nếu cần đều có thể tải khóa công khai đó về tạo một mật thư gửi cho địa chỉ email đó, không cần quen biết, thỏa thuận gì trước.

  • Không cần có một phương thức phân phối khóa mã tin cậy và bí mật. Để đàm bảo bí mật, khóa mã kiểu gì cũng phải định kỳ thay đổi. Trước đây, dùng hệ thống mã hóa một khóa, các ngân hàng, bộ ngoại giao phải cử người đi khắp thế giới để giao khóa mã mới rất mất thì giờ và tốn kém.

4-Hàm băm mật mã (Cryptographic Hash function – CHF)

Khái niệm hàm băm (hash function) khác với khái niệm hàm băm mật mã (cryptographic hash function). Dưới đây ta chỉ xét khái niệm thứ hai và gọi tắt là hàm băm.

Định nghĩa: CHF là một thuật toán xác định, áp dụng vào một khối dữ liệu có chiều dài bất kỳ để tính ra được một một chuỗi bit có chiều dài cố định (128 bits,256 bits, …) gọi là trị số băm (hash value) sao cho khi dữ liệu thay đổi dù chỉ một bit thì khi tính lại trị số băm sẽ thay đổi và do đó, mỗi khối dữ liệu sẽ có một trị số băm duy nhất.

Hiểu nôm na, một khối dữ liệu có một trị số băm duy nhất tương tự như số chứng minh với một người. Điểm khác biệt là khi người đó chỉ rụng một sợi tóc thì khi tính lại trị số băm cũng thay đổi.

Tại sao lại dùng từ “băm”: để tính trị số băm, thường dữ liệu được chia nhỏ (băm) ra thành nhiều phần rồi áp dụng một thuật toán tính nào đó.

Một hàm băm lý tưởng sẽ có các tính chất sau:

  • Dễ dàng tính trị số băm với bất kỳ khối dữ liệu nào.

  • Từ trị số băm không thể tính ngược ra khối dữ liệu (hàm một chiều).

  • Không thể thay đổi khối dữ liệu (dù chỉ một bit) mà không làm thay đổi trị số băm.

  • Không thể có hai khối dữ liệu khác nhau mà có cùng một trị số băm.

Dùng làm gì:

  • Xác nhận tính toàn vẹn của dữ liệu sau khi truyền qua mạng: các file cài đặt một bản Linux (iso) được đặt trên Internet kèm theo trị số băm md5. Sau khi tải file về, tính lại md5 của file đã tải, nếu giống với trị số đã cho trước tức là file tải về nguyên vẹn, giống hoàn toàn như file đặt trên Internet, không bị lỗi (thiếu, sai) khi download. Một email, một file được gửi qua mạng cùng với trị số băm ban đầu của nó để người nhận kiểm tra tương tự.

  • Dùng trong chữ ký số (xem phần dưới)

  • Kiểm tra password: một phần mềm tạo ra password rồi lưu giữ không phải dưới dạng nguyên bản đọc được mà dưới dạng trị số băm của password đó (để tránh bị hacker xâm nhập lấy cắp). Khi user khai password, password đó được tính trị số băm và so sánh với trị số đã lưu.

  • ….

5-Chữ ký số (digital signatures)

Một chữ ký số đặt vào một văn bản điện tử cũng có công dụng tương tự như một chữ ký tay vào văn bản giấy:

  • Nó xác nhận rằng văn bản đúng là do người ký phát hành.

  • Người đã ký cũng không thể phủ nhận là mình không phát hành văn bản đó vì chỉ người đó mới có chữ ký số đó. Chữ ký tay có thể bắt chước giả mạo được, nhưng chữ ký số thì không. Cũng không thể tách chữ ký số ra khỏi một văn bản và gán nó vào văn bản khác.

  • Chữ ký số còn một công dụng nữa mà chữ ký tay không có là nó xác thực văn bản gốc vẫn nguyên vẹn không bị sửa đổi trên đường truyền. Văn bản giấy mà bị cạo sửa tinh vi thì chắc phải dùng máy móc chuyên dụng mới phát hiện được.

Hình 5.1: Chữ ký số

Quá trình tạo và kiểm tra chữ ký số cũng dùng kỹ thuật mã hóa hai khóa nhưng ngược với cách mã hóa đã nói ở trên, gồm 3 thuật toán:

  • Một thuật toán tạo khóa tạo ra một cặp khóa bí mật và công khai theo các số ngẫu nhiên như đã mô tả ở trên.

  • Một thuật toán tạo chữ ký số: từ một văn bản và một khóa bí mật tạo ra một chữ ký số và chèn nó vào văn bản. Văn bản trở thành văn bản đã ký.
    Trong hình bên trái của Hình 5.1, trị số băm của văn bản được tính sau đó mã hóa bằng khóa bí mật của người ký tạo thành chữ ký số của người đó. Nếu dùng dịch vụ chữ ký số của một nhà cung cấp thì có kèm theo một giấy chứng nhận (certificate) của nhà cung cấp đó. Tất cả được chèn vào văn bản tạo thành văn bản đã ký (Digital signed data)

  • Một thuật toán kiểm tra dùng văn bản đã ký, khóa công khai của người ký để xác thực chữ ký đúng là của người ký. Trong hình bên phải của Hình 5.1, từ văn bản đã ký tách riêng phần văn bản và chữ ký. Sau đó tính trị số băm của văn bản, dùng khóa công khai của người ký để giải mã chữ ký số và tách ra trị số băm gốc đã kèm trong chữ ký đó ở bước trên. Nếu hai trị số băm trùng nhau thì chữ ký đúng. (và văn bản đúng nguyên bản gốc không bị thay đổi trên đường truyền).

Hai hệ thống chữ ký số phổ biến hiện nay là RSA DSA.


6-PGP – một hệ thống mã hóa hỗn hợp.

PGP (Pretty Good Privacy) là một hệ thống mã hóa hỗn hợp, kết hợp những ưu điểm của hai hệ thống mã hóa một khóa và hai khóa nêu trên, do Phillip Zimmermann sáng tạo ra năm 1991.

Các bước phần mềm PGP thực hiện:

  • Nén dữ liệu chưa mã hóa lại. Việc nén này làm giảm thời gian truyền qua mạng và tiết kiệm ổ cứng nhưng tác dụng chính là tăng cường an ninh. Phần lớn các kỹ thuật phá mã (cryptanalysis) tìm kiếm các mẫu ký tự giống nhau trong dữ liệu đã mã hóa để dò ra khóa mã. Khi nén, số các mẫu giống nhau đó giảm xuống tối thiểu, sẽ khó dò hơn rất nhiều.

  • Tạo khóa mã bí mật dùng một lần (session key). Khóa mã này là một số ngẫu nhiên được tạo ra dựa trên chuyển động ngẫu nhiên của chuột và các phím ngẫu nhiên đã gõ. (TrueCryp dùng cách tạo khóa này, nhưng không phải dùng một lần, xem ở đây).

  • Mã hóa dữ liệu đã nén: Dùng khóa mã vừa tạo và một thuật toán mã hóa một khóa nhanh và tin cậy để mã hóa dữ liệu đã nén. Kết quả là dữ liệu được mã hóa (từ plaintext thành cyphertext). Để giải mã cũng vẫn dùng session key. Hai bước 2,3 dữ liệu được mã hóa bằng kỹ thuật mã hóa một khóa bí mật đã nói ở trên.

  • Mã hóa khóa mã session key: dùng khóa công khai của người nhận (public key) để mã hóa khóa bí mật dùng một lần (session key). Kết quả có được session key đã mã hóa.

  • Gửi dữ liệu đến người nhận: Gửi đồng thời cả dữ liệu đã mã hóa (cyphertext) và session key đã mã hóa cho người nhận.

  • Người nhận giải mã theo ba bước: dùng private key của mình để giải mã session key. Khi đã có session key, dùng nó để giải mã dữ liệu. Sau đó dữ liệu được giải nén để có thể đọc được. Ba bước đó phần mềm PGP tự làm. Như vậy trong các bước 4,5,6 session key được mã hóa dùng kỹ thuật mã hóa hai khóa.

Hình 6.1: PGP mã hóa và gửi đi ở máy tính người gửi

Hình 6.2: PGP giải mã trên máy tính người nhận

Trên đường truyền, người thứ ba có thể chặn, sao chép được dữ liệu đã mã hóa và session key đã mã hóa. Muốn giải mã được dữ liệu phải giải mã được session key, mà session key chỉ giải mã được bằng private key lưu ở máy tính người nhận. Session key lại là số ngẫu nhiên và quá lớn nên không thể dò bằng cách vét cạn các tổ hợp ký tự được.

Năm 1997, PGP trở thành chuẩn gọi là OpenPGP. Hầu hết các chương trình email hiện nay đều hỗ trợ chuẩn này.

Tổ chức Phần mềm Tự do (Free Software Foundation) đã xây dựng một phần mềm tự do, nguồn mở tương thích với OpenGPG gọi là GNU Privacy Guard (viết tắt GnuPG hoặc GPG) và một số giao diện đồ họa dùng thư viện GnuGPG để mã hóa, giải mã và ký số ( KGPG, Seahorse, MacGPG)

(còn tiếp)

Advertisements

5 thoughts on “Ghi chép về mã hóa 1

  1. Tuy mới chỉ là nhập môn yếu lược nhưng đọc vô một khúc thì thấy rất cần chai dẩu Nhị Thiên Đường rồi. Bài viết sáng sủa khiến newbie như tui cũng có thể thụ ích rất nhiều. Cám ơn tác giả.

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s