Máy tính đã sử dụng các giải thuật mã hóa để bảo vệ thông tin trong quá trình trao đổi trên internet toàn cầu như thế nào?
Máy tính đã sử dụng các giải thuật mã hóa để bảo vệ thông tin trong quá trình trao đổi trên internet toàn cầu như thế nào?
Máy tính và internet là những thứ không thể thiếu trong cuộc sống hằng ngày của chúng ta trong thời đại bây giờ. Chúng ta dùng Facebook để chia sẽ những khoảnh khắc với bạn bè, chúng ta dùng email để gửi thư hằng ngày, hay có những cuộc trò chuyện với bất kì ai ở bất kì đâu chỉ cần một chiếc điện thoại có thể truy cập được internet. Hầu hết chúng ta đều quá quen thuộc với việc đăng nhập vào tài khoản Facebook bằng tài khoản của mình cùng một mật khẩu, hay soạn và gửi email cho một ai đó. Trong quá trình đó, điện thoại hay máy tính của chúng ta phải đảm bảo quá trình đăng nhập hay gửi mail đến được người nhận là cực kì quan trọng. Nhưng có một việc cực kì quan trọng mà bất kì hệ thống máy tính nào cũng phải đảm bảo, đó là đảm bảo an toàn cho thông tin của người dùng. Làm thế nào máy tính lưu trữ thông tin mật khẩu của chúng ta một cách an toàn mà không bị đánh cắp bởi người khác? Làm thế nào mà nội dung trao đổi email của chúng ta không bị xem lén bởi người khác khi chúng ta gửi email thông qua internet?

Những bức thư

Vào thời kì sơ khai của nhân loại, lúc mà khoa học công nghệ còn hạn chế, người ta chủ yếu trao đổi thông tin với nhau qua những bức thư, và phương tiện truyền tải những bức thư ấy có thể là chim bồ câu nhưng chủ yếu là con người. Quá trình này hoàn toàn không có tính bảo mật thông tin cho nội dung của bức thư, những người trao đổi thư buộc phải tin tưởng tuyệt đối vào người đưa thư. Họ có thể hạn chế việc xem trộm nội dung bằng cách niêm phong lá thư với con dấu của người gửi, người nhận có thể biết là lá thư có thể bị xem trộm hay không thông bằng việc xem xét con dấu đó. Cách này có thể hiệu quả phần nào nhưng không thể ngăn chặn hoàn toàn việc nội dung lá thư bị xem trộm.
Vào thời La Mã cổ đại, nhà thiên tài quân sự Julius Caesar đã nghĩ ra một cách rất thông minh để hạn chế việc xem trộm nội dung thư. Trong các cuốn sách kể về ông có kể lại rằng, trong các cuộc chinh chiến của mình, khi Caesar cần gửi một bức thư tuyệt mật, ông đã dịch chuyển nội dung bức thư thành những nội dung mà chỉ có ông và người nhận có thể hiểu được. Cách làm của ông rất đơn giản, mỗi khi ông cần viết một kí tự trên bản chữ cái, ông sẽ không viết kí tự đó, mà ông sẽ biểu diễn kí tự đó bằng kí tự đứng sau 3 cấp trong bảng chứ cái. Ví dụ khi ông muốn biểu diễn kí tự A, ông sẽ viết kí tự D thay cho, tương tự: B sẽ thành E, C sẽ thành F, ... Theo cách này, giả sự Caesar muốn gửi lời nhắn là: "Hello, I'm Caesar", thì nội dung trong bức thư sẽ là: "Khoor, L'p Fdhvdu". Chúng ta thấy rằng, nội dung của bức thư sau khi dịch chuyển không thể hiểu được nếu chúng ta không biết cách dịch ngược lại nội dung gốc. Để có thể hiểu được, người nhận cần dịch ngược lại bức thư theo công thức ngược lại, mỗi kí tự trong bức thư sẽ biểu diễn bởi kí tự đứng trước nó 3 cấp. Vì vậy, K sẽ thành H, H sẽ thành E, ... và ta sẽ có nội dung thật sự mà Caesar muốn gửi.
Bằng cách này, chúng ta có thể nghĩ rằng nội dung bức thư đã được đảm bảo tuyệt mật cho dù có người xem trộm nó đúng không? Không phải vậy, không hẳn là tuyệt mật. Chúng ta hãy cùng nhìn lại bức thư sau khi đã dịch chuyển các kí tự, chúng ta thấy rằng, suy cho cùng, bức thư sau khi dịch chuyển cũng chỉ là một phép thay đổi các kí tự trong bản chữ cái theo công thức là dịch chuyển 3 kí tự. Chúng ta không cần biết đến công thức này cũng có thể dò tìm ra nội dung thật của bức thư bằng các phép thử. Chúng ta thử dịch chuyển các kí tự lần lượt và đến khi ta có thể đọc được bức thư, vì bảng chữ cái cũng chỉ có 26 kí tự, chúng ta chỉ cần thử nhiều nhất 25 lần là có thể biết được nội dung của bức thư. Rõ ràng, để có thể an toàn hơn, chúng ta cần một công thức có nhiều phép thử hơn, khiến cho việc cố gắng thử dịch ngược nội dung bức thư là không thể. Thách thức càng lớn hơn trong thời đại công nghệ số ngày nay, khi mà các máy tính có thể thực hiện hàng triệu phép tính trong thời gian tính bằng giây thì việc thử 25 cách khác nhau để dịch ngược một bức thư như trên là quá dễ dàng.
Tuy nhiên vào thời kì đó, đó là một cách quá thông minh để bảo mật thông tin của Ceasar. Ông là người gần như đặt nền móng cho việc mã hóa thông tin. Quá trình dịch chuyển các kí tự của bức thư được gọi là mã hóa thông tin, quá trình dịch ngược lại nội dung ban đầu được gọi là giải mã thông tin. Cách thức mà Caesar dùng để dịch chuyển kí tự A thành D được gọi là giải thuật mã hóa và số 3 được gọi là chìa khóa của giải thuật mã hóa. Giải thuật mà ông đã sử dụng sau này được thế giới công nhận và được đặt theo tên của ông, nó được gọi là Caesar Cipher.

Dùng máy tính để đánh bại chính nó

Như đã nói ở trên, để có thể mã hóa thông tin, chúng ta phải nghĩ ra giải pháp mà ngay cả các máy tính tính toán với tốc độ cao cũng không thể giải mã, máy tính có thể thử hàng triệu kết quả trên giây, làm sau có giải thuật mã hóa nào có thể ngăn chặn điều đó? Nhưng may mắn thay, chúng ta đã làm được điều đó, chúng ta đã tìm ra các giải thuật mà ngay cả máy tính cũng không thể bẻ khóa. Chúng ta hãy thử xem xét lại cách mà Caesar đã làm, nhưng với một ý nghĩ khác, thay vì dịch chuyển các kí tự này thành các kí tự khác trong bảng chữ cái, thì chúng ta hãy xem các kí tự là các con số và dịch chuyển chúng thành các con số vô cùng lớn. Bằng cách này, để có thể ber khóa, thay vì chỉ cần thử 25 lần các kí tự trong bảng chữ cái, ta phải thử vô vàn cách, nếu ta dùng các con số càng lớn, thì các phép thử cần phải thử là vô cùng nhiều và gần như không thể thử hết.
Chúng ta có thể hình dung như sau, thay vì dịch kí tự A thành D với chìa khóa giải thuật là 3 (dịch sang phải 3 kí tự), ta sẽ biểu diễn kí tự A bằng số 0 và sử dụng chìa khóa là 1.000.000.000 (1 tỷ). Lúc này, để có thể bẻ khóa, chúng ta cần thử 1 tỷ lần, rõ ràng là quá giới hạn với sức của con người. Nhưng con số 1 tỷ xem chừng là bài toán quá dễ đối với máy tính, chúng chỉ mất vài giây để thử hết các kết quả, chúng ta cần sử dụng các con số lớn, lớn hơn, rất rất lớn hơn nữa.
Thật vậy, ngày nay, để mã hóa thông tin, chúng ta dùng các giải thuật sử dụng các con số vô cùng lớn, lớn đến nổi mà ngôn từ của chúng ta không thể đọc được con số đó. Ví dụ chúng ta hãy xem xét con số này: "115792089237316195423570985008687907853269984665640564039457584007913129639935". Con số này quá lớn, và các nhà khoa học học máy tính đã chứng minh rằng: với tốc độ máy tính ngày nay, thậm chí là siêu máy tính, có thể mất hàng nghìn năm để máy tính thử hết các con số từ 0 đến con số vô cùng lớn ấy. Nếu bạn có thể nghĩ rằng thay vì phải thử từng con số, tại sao không cho máy tính thử ngẫu nhiên các con số, biết đâu sẽ vô tình cho ra kết quả đúng không? Nếu bạn có thể nghĩ như thế, bạn quả là sáng suốt! Nhưng, chúng ta hãy cùng làm một phép tính xác suất đơn giản, và ta sẽ thấy xác suất để vô tình chọn đúng một con số là vô cùng vô cùng thấp và gần như không thể xảy ra.
Việc bẻ khóa một giải thuật mã hóa khó như thế, việc mã hóa hoặc giải mã dữ liệu cũng không hề dễ. Hay tưởng tượng xem, để mã hóa hay giải mã các kí tự, chúng ta buộc phải tính toán với con số vô cùng lớn kia, rõ ràng không phải là việc con người có thể làm được, nhưng máy tính thì có thể. Chúng ta khó có thể tính toán chính xác với con số vô cùng lớn, nhưng chúng ta có thể lập trình để máy tính tính toán thay cho chúng ta, và đó là cách mà các phần mềm máy tính bảo vệ thông tin của chung ta. Khi chúng ta gửi một email, máy tính sẽ mã hóa nội dung email của chúng ta bằng một giải thuật và chìa khóa là một số vô cùng lớn ngẫu nhiên (con số bên trên chỉ là một vì dụ về một số vô cùng lớn). Khi phần mềm của người nhận nhận được email, nó sẽ dùng lại cùng giải thuật và cùng chìa khóa để giải mã nội dung của bức thư. Bằng cách này, máy tính có thể đảm bảo thông tin được bảo mật trong quá trình vận chuyển trên internet, cho dù có người nghe lén nội dung của email, họ cũng không thể đọc được email đó nếu họ không biết giải thuật và chìa khóa.
Đến đây, tôi có một ý nghĩ, con người chúng ta tạo ra máy tính để phục vụ cho chính mình, chúng thay ta làm việc nhanh chóng và chính xác, đồng thời chúng ta cũng nghĩ ra cách để hạn chế chúng làm những việc mà ta không mong muốn, con người quả là phi thường, giải thuật mã hóa trên cũng vậy đúng không?

Một cách an toàn hơn

Trong quá trình trao đổi email mã hóa như chúng ta thấy ở trên, có vẻ như mọi thứ an toàn tuyệt đối: email không thể bị bẻ khóa cho dù có bị nghe lén trên internet. Nhưng nếu chúng ta chú ý rằng, để có thể trao đổi email mã hóa như thế, cả người gửi và người nhận phải biết cùng một giải thuật và cùng một chìa khóa mã hóa. Nghĩa là nếu người gửi mã hóa email với khóa X, thì họ bằng cách nào đó phải cho người nhận biết khóa là X, họ buộc phải gửi khóa X kèm theo email chăng? Vậy nếu trong quá trình trao đổi thông tin khóa cũng bị nghe lén thì sao, thì nội dung bức thư cũng bị nghe lén theo dễ dàng!
Chúng ta hãy cùng xem xét việc gửi email theo một cách dễ hiểu hơn, Alice muốn gửi một bức thư viết tay cho Bob, cô nghĩ ra một cách khá thông minh, Alice bỏ bức thư vào một cái hộp, khóa lại và gửi cho Bob thông qua người đưa thư. Bằng cách này, Alice có thể chắc chắn rằng bức thư được an toàn nếu Bob nhận hộp thư nguyên vẹn không bị bẻ khóa. Nhưng để mở hộp thư, Bob cần lấy được cái chìa khóa mà Alice đã dùng để khóa hộp thư, rõ ràng Alice không thể gửi chìa khóa đi cùng hộp thư, vì như vậy lá thư dễ dàng bị xem trộm. Alice có thể gửi chìa khóa đến cho Bob thông qua một người vận chuyển khác, nhưng vẫn có khả năng người vận chuyển đó và người vận chuyển hộp thư có cùng mục đích là xem trộm bức thư, rõ ràng đây chưa phải là cách an toàn nhất để gửi bức thư.
Chúng ta thấy rằng, việc vận chuyển chìa khóa của Alice cho Bob là không an toàn, việc đó dẫn đến khả năng bị xem trộm bức thư. Vậy có cách nào để Alice không phải gửi chìa khóa mà Bob vẫn có thể mở khóa hộp thư để xem được bức thư hay không? May mắn thay, Alice và Bob đã thống nhất với nhau một cách rất thông minh. Cả Alice và Bob mỗi người sẽ giữ một chiếc hộp và một chìa khóa duy nhất, khi Alice muốn gửi bức thư cho Bob, Alice sẽ yêu cầu Bob gửi cho Alice chiếc hộp thư của Bob, Alice bỏ thư vào hộp, khóa lại và gửi lại cho Bob. Lúc này, Alice không cần gửi chìa khóa sang cho Bob vì Bob đã giữ chìa khóa của chiếc hộp đó rồi, quá trình vận chuyển thư là tuyệt đối an toàn nếu Bob giữ an toàn chiếc chìa khóa của mình.
Các phần mềm máy tính nói chung và phần mềm email nói riêng trao đổi thông tin theo cái cách mà Alice và Bob đã dùng. Ở mỗi tài khoản người dùng, phần mềm email sinh ra 2 khoá được gọi là khoá bí mật (private key) và khoá công khai (public key). Để dễ hình dung, chúng ta xem khoá bí mật và khoá công khai tương ứng là chìa khoá và hộp thư của Alice và Bob. Khi gửi email, phần mềm sẽ dùng khoá công khai của người nhận để mã hoá nội dung bức thư, và phần mềm bên phía người nhận sẽ sử dụng khoá bí mật để giải mã bức thư. Rõ ràng cách trao đổi thông tin này hiệu quả và an toàn hơn nhiều vì người gửi và người nhận không cần phải trao đổi khoá bí mật. Nhưng chẳng phải người nhận email cần gửi khoá công khai của mình cho người gửi email sao? Nếu khoá công khai này bị lộ thì sao? Không sao cả, vì giải thuật mã hoá dạng này đảm bảo rằng thông tin được mã hoá bằng khoá công khai chỉ có thể giải mã bằng khoá bí mật mà thôi, cho dù người nghe lén có biết được khoá công khai cũng không thể giải mã hay bẻ khoá được bức thư. Và đây là cách phổ biến nhất mà các phần mềm dùng để trao đổi thông tin một cách an toàn ngày nay.

Đường một chiều, bạn không thể đi ngược lại

Chúng ta chắc hẳn ai cũng dùng Facebook, khi chúng ta đăng nhập vào tài khoản của mình, chúng ta cung cấp cho Facebook thông tin email và mật khẩu để Facebook có thể xác minh chúng ta là chủ tài khoản. Vậy phần mềm Facebook cần lưu thông tin mật khẩu của chúng ta để có thể đối chiếu khi ta đăng nhập, nhưng làm sau để lưu trữ cho nó an toàn mà không bị lộ thông tin mật khẩu của người dùng? Hay có cách nào đó mà Facebook không cần lưu mật khẩu của người dùng nhưng vẫn có cách đối chiếu khi người dùng đăng nhập hay không?
Con người chúng ta thật sự rất thông minh, chúng ta đã nghĩ ra một cách không cần lưu mật khẩu của người dùng nhưng vẫn có cách xác mình rằng mật khẩu mà người dùng nhập vào lúc đăng nhập là có đúng hay không. Có phải bạn đang nghĩ đến mã hoá mật khẩu của người dùng đúng không? Thật ra không phải vậy! Khi người dùng đăng kí tài khoản, họ cung cấp cho Facebook thông tin mật khẩu họ muốn dùng, lúc này Facebook sẽ sử dụng một giải thuật gọi là băm (hash) để băm mật khẩu người dùng ra một giá trị khác. Quá trình này đảm bảo rằng việc dịch ngược từ giá trị sau khi băm thành mật khẩu ban đầu là không thể thực hiện được, và Facebook chỉ cần lưu trữ giá trị băm này mà thôi. Khi người dùng nhập mật khẩu để đăng nhập, Facebook băm nó ra và so sánh với giá trị băm đã lưu, nếu chúng trùng nhau thì mật khẩu đúng, nếu không trùng thì mật khẩu sai. Và nó càng an toàn hơn khi mà giá trị băm cho dù có bị đánh cắp thì người đánh cắp cũng không thể biết mật khẩu là gì vì không có cách để dịch giá trị băm thành mật khẩu ban đầu. Đây là cách mà các phần mềm ngày nay sử dụng để lưu thông tin nhạy cảm như mật khẩu, mã PIN hay mã khoá,...

Chữ kí số

Điều gì nếu Alice gửi một bức thư hẹn Bob vào cuối tuần làm một việc quan trọng nhưng Bob cần biết chắc là lá thư đó được gửi từ chính Alice? Nếu dùng cách mã hoá bằng hộp thư và chìa khoá bên trên, Bob cũng không có cách nào xác nhận người gửi lá thư cho Bob chính là Alice, vì ai cũng có thể giả mạo Alice yêu cầu Bob gửi hộp thư, bỏ thư vào, khoá lại và gửi cho Bob đúng không?
Trong trường hợp cụ thể hơn, Caesar gửi thư cho các đồng minh hẹn ngày tấn công vào một toà thành, làm sao các đồng minh biết rằng và tin rằng lá thư đó được gửi từ chính Caesar mà không phải là giả mạo? Ở thời điểm đó, người ta chỉ có thể xác nhận thông qua chứng minh của con dấu trong bức thư được gửi, họ quan sát bằng mắt và phải tin vào mắt mình. Các con dấu hoàn toàn có thể làm giả, và rõ ràng đó không phải là cách an toàn trong trường hợp này.
Các nhà khoa học máy tính một lần nữa xuất sắc giải quyết được bài toán này. Họ cũng dùng một cách khá tương tự như mã hoá thông tin là mỗi người sẽ có một khoá công khai và khoá bí mật, nhưng lần này cách dùng là khác nhau. Khi Alice muốn gửi thông tin cho Bob, Alice sử dụng một giải thuật chữ kí số và khóa bí mật của mình để mã hoá khoá công khai của mình kèm với dữ liệu như là đính kèm chữ kí của mình. Khi Bob nhận được thư, ngoài việc giải mã thư như lần trước, Bob cần phải làm thêm một bước, đó là dùng giải thuật chữ khí số để lấy ra thông tin chữ kí số của bức thư. Nếu chữ kí số đó trùng với khoá công khai của Alice, thì Bob có thể khẳng định chắc chắn rằng lá thư được gửi từ Alice. Vì trong giải thuật chữ kí số, chỉ duy nhất người sở hữu khoá bí mật mới có thể sinh ra chữ kí số trùng với khoá công khai của mình mà thôi. Nếu giải thuật mã hoá đảm bảo thông tin được truyền tải an toàn thì giải thuật chữ kí số giúp chúng ta xác nhận đích danh người gửi thông tin.
Ngày nay các nhà khoa học máy tính đã tìm ra vô vàn giải thuật để bảo mật thông tin trên internet, nhưng nhìn chung, máy tính và các thiêt bị điện tử ngày nay trao đổi thông tin bảo mật tương tự cách Alice và Bob trao đổi thư mà thôi. Liệu trong tương lai con người có thể phát minh ra một cổ máy có thể bẻ khóa các giải thuật này hay không? Nếu có thì quả là một bài toán quá nan giải cho khoa học máy tính để có thể bảo vệ hệ thống thông tin dữ liệu toàn cầu. Nhưng đâu ai biết trước được bộ óc siêu phàm của chúng ta có thể làm được những chuyện gì chứ!
Link bài viết gốc trên trang blog của mình: