Chương I: Cơ sở của chữ ký số, các loại mật mã và mã hóa khối
1.Một số khái niệm về mã hóa
+ Trong ngành mật mã học, mã hóa là quá trình dùng để biến thông tin từ dạng này sang dạng khác và ngăn những người không phận sự tiếp cận vào thông tin đó. Bản thân việc mã hóa không ngăn chặn việc thông tin bị đánh cắp, có điều thông tin đó lấy về cũng không xài được, không đọc được hay hiểu được vì đã được làm biến dạng đi rồi. + Mã hóa sẽ mang lại tính an toàn cao hơn cho thông tin, đặc biệt là trong thời đại Internet ngày nay, khi mà thông tin phải đi qua nhiều trạm trung chuyển trước khi đến được đích. Nếu không có mã hóa, khả năng thông tin của bạn sẽ bị ai đó xem trộm trong quá trình truyền tải, rồi lợi dụng để làm việc xấu là hoàn toàn hiện hữu. + Về lý thuyết, bất kì thông điệp mã hóa nào cũng có thể bị giải mã mà không cần biết về thuật toán hoặc các khóa mã hóa, vấn đề là mất bao lâu và nguồn lực tính toán cần thiết là như thế nào. 2.Các loại mã hóa dữ liệu Mã hóa cổ điển + Mã hoá cổ điển là cách đơn giản nhất, tồn lại lâu nhất trên thế giới và không cần khóa bảo mật, chỉ cần người gửi và người nhận cùng biết về thuật toán này là được. + Tuy nhiên, giải pháp mã hóa này được xem là không an toàn, vì nếu một người thứ ba biết được thuật toán thì xem như thông tin không còn bảo mật nữa. Việc giữ bí mật thuật toán trở nên rất quan trọng, và không phải ai cũng có thể giữ bí mật đó một cách trọn vẹn. Có khả năng người đó sẽ rò rỉ ra, hoặc có ai đó ngồi giải ra thuật toán thì xem như chúng ta thua cuộc. + Một số mã hóa cổ điển như: Mã hóa dịch vòng, Mã hóa thay thế, Mã hóa Affine. Mã hóa một chiều (hash) + Phương pháp này dùng để mã hóa những thứ không cần dịch lại nguyên bản gốc. Ví dụ, khi bạn đăng nhập vào Tinh tế, mật khẩu mà bạn nhập sẽ được chuyển thành một chuỗi dài các kí tự bằng một thứ gọi là hash function. Chuỗi này sẽ được lưu vào cơ sở dữ liệu, chứ không lưu mật khẩu thô của bạn nhằm tăng tính bảo mật. Lỡ hacker có trộm dữ liệu thì cũng chỉ thấy những thứ như FIiyXYB547bhvyuuUIbZ chứ không biết password thật của bạn là gì. Mỗi lần bạn đăng nhập, hash function sẽ “băm” password thật của bạn thành chuỗi kí tự rồi so sánh nó với cái trong cơ sở dữ liệu, nếu khớp thì đăng nhập tiếp, không thì báo lỗi. Chúng ta không có nhu cầu dịch ngược chuỗi nói trên ra lại thành password thật để làm gì cả. + Nói thêm về hash function, nhiệm vụ của nó là chuyển một chuỗi có độ dài bất kì thành chuỗi kí tự có độ dài cố định. Ví dụ, nếu bạn quy định chuỗi kí tự sau khi “băm” sẽ dài 10 kí tự thì dù đầu vào của bạn có bao nhiêu chữ đi nữa thì kết quả nhận được sẽ luôn là 10 và chỉ 10 kí tự mà thôi. + Đặc điểm của hash function là trong cùng 1 điều kiện, dữ liệu đầu vào như nhau thì kết quả sau khi băm cũng sẽ y hệt như nhau. Nếu chỉ đổi một chút xíu thôi, có khi chỉ là 1 kí tự nhỏ thì chuỗi kết quả sẽ khác hoàn toàn. + Cũng vì vậy mà người ta dùng hash function để kiểm tra tính toàn vẹn của dữ liệu. Ví dụ, trước khi gửi một tập tin Word cho người bạn thì mình dùng mã hóa một chiều và tạo ra được chuỗi sau băm là DFYUBUfyeufuefu. Khi người bạn đó tải tập tin về máy, nếu nó băm và cũng nhận được chuỗi DFYUBUfyeufuefu thì có nghĩa là tập tin của mình không bị can thiệp bởi hacker, còn nếu kết quả khác thì có nghĩa là quá trình truyền tải có thể đã bị lỗi làm mất một phần dữ liệu, hoặc tệ hơn là có ai đó đã xén bớt hay thêm vào thứ gì đó rồi. + Hiện nay, hai thuật toán hash function thường được dùng nhất là MD5 và SHA. Nếu bạn tải tập tin trên mạng thì đôi khi sẽ thấy dòng chữ MD5 do tác giả cung cấp, mục đích là để bạn so sánh file đã tải về với file gốc xem có bị lỗi gì không. Mã hóa đối xứng (symmetric key encryption) + Là những hệ mật được sử dụng chung 1 khóa trong quá trình mã hóa và mã hóa. Do đó khóa phải được giữ bí mật tuyệt đối. + Một số hệ mật mã khóa đối xứng hiện đại mà mình thấy hay được sử dụng là DES, AES, RC4, RC5,... + Cách thức hoạt động: Một sơ đồ mã hóa đối xứng thường sử dụng một khóa đơn được chia sẻ giữa 2 hoặc nhiều người dùng với nhau. Khóa duy nhất này sẽ được dùng cho cả 2 tác vụ mã hóa và giải mã các văn bản thô (các tin nhắn hoặc mảnh dữ liệu cần được mã hóa). Quá trình mã hóa bao gồm việc chạy văn bản thô (đầu vào) thông qua một thuật toán mã hóa còn gọi là mật mã (cipher) sẽ lần luợt tạo ra các bản mã -ciphertext (đầu ra). Khi sơ đồ mã hóa đủ mạnh thì cách duy nhất để đọc và truy cập được các thông tin chứa trong các bản mã là sử dụng khóa tương ứng để giải mã. Quá trình giải mã về cơ bản sẽ chuyển đổi các bản mã trở về dạng văn bản thô ban đầu. Mức độ bảo mật của các hệ thống mã hóa đối xứng sẽ phụ thuộc vào độ khó trong việc suy đoán ngẫu nhiên ra khóa đối xứng theo hình thức tấn công brute force. Lấy ví dụ, để dò ra mã hóa của 1 khóa 128-bit thì sẽ mất tới vài tỷ năm nếu sử dụng các phần cứng máy tính thông thường. Thông thường, các khóa có độ dài tới 256-bit có thể được xem là có độ bảo mật cao tuyệt đối, có khả năng chống lại được hình thức tấn công brute force từ các máy tính lượng tử. Trong số các sơ đồ mã hóa đối xứng được sử dụng ngày nay thì có 2 loại thông dụng nhất là nền tảng mật mã block và stream. Trong mật mã block, dữ liệu được nhóm vào từng khối theo kích thước định trước, mỗi khối được mã hóa bằng khóa đối xứng và thuật toán mã hóa (vd: các văn bản thô 128-bit sẽ được mã hóa thành các bản mã 128-bit). Khác với mật mã block, mật mã stream không mã hóa dữ liệu văn bản thô theo block mà mã hóa theo các gia số 1-bit (mỗi văn bản thô 1-bit được mã hóa thành bản mã 1-bit mỗi lần). Mã hóa bất đối xứng (public key encryption) + Có thể hiểu là người ta dùng hai chìa khóa khác nhau để khóa và mở khóa thông tin bí mật. Public key sẽ được công khai và được gửi đi đến đối tượng cần mã hóa thông tin, còn private key được giữ bí mật và nó đóng vai trò như chìa khóa vạn năng có thể mở được tất cả thông tin được khóa bằng public key. Hầu như các ứng dụng bạn dùng hàng ngày hiện nay như Facebook, Gmail, Amazon, PayPal,… đều sử dụng giao thức HTTPs. Có thể hiểu là giao thức HTTPs an toàn hơn HTTP vì toàn bộ thông tin truyền đi giữa client và server được bảo vệ bởi bộ mã hóa SSL/TSL. SSL/TSL này hoạt động dựa trên cả hai loại mã hóa đối xứng và bất đối xứng. Nhờ nó mà chúng ta có thể đảm bảo bí mật khi thực hiện những giao dịch có chứa thông tin nhạy cảm trên Internet mà không bị đánh cắp thông tin trong suốt quá trình truyền nhận dữ liệu. Có thể nói, nếu không có mật mã, đặc biệt là mã hóa bất đối xứng thì không có thương mại điện tử. + Điểm yếu của mã hoá đối xứng được khắc chế trong mã hoá bất đối xứng. Ý tưởng là thay vì gửi chìa khoá cho phía client, thì server sẽ gửi ổ khoá, để client khoá thông điệp bí mật trong một chiếc hộp, và chỉ có server có thể giải mã được. Cho nên các client sẽ không đọc được thông điệp của nhau, và chỉ có sever với private key mới mở khoá được những chiếc hộp này. Mã hóa RSA + RSA là một trong những hệ thống mã hóa bất đối xứng được sử dụng rộng rãi. Nó được đặt theo tên của 3 nhà khoa học MIT thiết kế ra nó là: Ron Rivest, Adi Shamir và Leonard Adleman. Ý tưởng then chốt để đảm bảo tính an toàn của RSA là dựa trên sự khó khăn trong việc phân tích nhân tử của 2 số nguyên tố lớn. (a x b = c, tìm ngược lại a,b từ c là phân tích nhân tử). + Hệ thống mã hoá RSA bao gồm 4 bước: key generation, key distribution, encryption và decryption. Vì để đảm bảo tính bí mật, nên mỗi hệ thống khác nhau cần tạo ra các public, và private key khác nhau. Sau quá trình handshake và public key được gửi tới phía client thì thông tin mới chính thức được mã hoá khi server và client giao tiếp với nhau. + Chữ ký số trong RSA Khi tạo chữ ký số thì người gửi thông tin sẽ sử dụng private còn người nhận sử dụng public key phục vụ cho việc nhận chữ ký. Thông tin được gửi qua RSA khá dài, gây ra trở ngại lớn đến việc mã hóa ở mặt thời gian. Vì vậy, trong thực hành chữ ký số thường sử dụng phương pháp mã hóa giá trị hash của bản tin. Việc này mang lại rất nhiều lợi ích như: Các hàm hash là hàm 1 chiều, vì vậy dù có được hash cũng không thể biết được bản tin gốc như thế nào. Độ dài hash là cố định và thường rất nhỏ, vì vậy chữ số sẽ không chiếm quá nhiều dung lượng. Mã hóa khối + Các hệ mã khối nổi tiếng đó là DES có kích thước khối là 64 (tức là mỗi lần mã hóa một khối bản rõ 64 bits và cho ra khối bản mã 64 bít) và kích thước khóa là 56 bits; AES có kích thước khối là 128 bit, và kích thước khóa là 128, 192 hoặc 256bit. + Thông thường block cipher chậm hơn so với stream cipher, nhưng làm việc tốt với những khối dữ liệu đã biết trước kích thước, ví dụ mã hóa file, mã hóa tin nhắn trên các giao thức như là HTTP ... + Các chế độ sử dụng Mã khối Thuật toán mã khối có đầu vào và đầu ra là các khối có độ dài xác định (như ở DES là 64bit). Để mã hóa một dữ liệu có độ dài tùy ý thì ta phải cắt dữ liệu thành nhiều khối đ ơn v ị và áp d ụng thuật toán mã nhiều lần, rồi sau sẽ kết hợp các khối dữ liệu thu được theo một sơ đồ nào đó. + Có nhiều loại sơ đồ, hay còn gọi là chế độ mật mã khác nhau, với ưu nhược đi ểm khác nhau và được áp dụng cho các nhu cầu khác nhau. + Các chế độ hay dùng: Chế độ bảng tra mã điện tử (Electronic code book -ECB) Trong chế độ này, các khối được tạo mật mã riêngbiệt, độc lập. Do đó, những khối tin gi ống nhau sẽ được mã hóa thành những khối mã giống nhau.Điều này trở nên nguy hiểm, t ạo miếng đất màu mỡ cho kẻ địch vận dụng tấn công replay cũng như thao tác biên tập theo khối.Kẻ thù có thể nghe trộm và tìm cách thu thập các mẫu tin-mã phổ biến, sau đó cắt ghép và trộn lẫn để tạo ra các bản mã giả mã bên nhận không phát hiện được. Chế độ mã móc xích (Cipher Block Chaining -CBC) Trong chế độ này, mỗi khối tin trước khi được mã hóa thì được XOR với khối mã sinh ra từ bước trước đó. Như vậy các khối mã đều phụ thuộc rất chặt vào nhau theo kiểu “móc xích”. Cũng qua đó có thể thấy rằng CBC sẽ tạo ra các khối bản mã khác nhau khi các khối tin đưa vào là giống nhau tức là che giấu được các mẫu tin-mã phổ biến khỏi sự theo dõi của kẻ thù, chặn đứng khả năng phá hoại bằng tấn công replay và biên tập nói trên. Tại bước đầu tiên, khi chưa có khối mã sinh ra từ bước trước, khối tin đầu sẽ được XOR với một vecto khỏi đầu, chọn ngẫu nhiên, ký hiệu là IV (initial vector). Chế độ Mã phản hồi k-bit (k-bit Cipher Feedback Mode -CFB) Với một số ứng dụng thời gian thực yêu cầu dòng dữ liệu truyền đến phải liên tục hơn là gián đoạn (như là chuỗi ký tự truyền giữa host và terminal phải tạo thành dòng ký tự liên tục). Do đó các chế độ mật mã khối xử lý và truyền theo từng khối một trở nên không thích hợp; các mã stream cipher với đơn vị xử lý là ký tự -khối 8 bit sẽ là thích hợp hơn với dạng ứng dụng này.Chế độ CFB là một cải tiến cho phép tạo ra khả năng truyền khối nhỏ k-bit (với k tùy ý) trong khi vẫn dùng thuật toán mã khối. Dòng tin đi vào được ‘múc’ bằng từng ‘gầu’ với dung lượng k bit mà k là tham số thay đổi được. Thuật toán mật mã khối E chạy liên tục như một lò nấu:ở mỗi bước người ta lấy k bit (bên trái nhất) của vector đầu ra từ E để bỏ vào ‘gầu’ k bit tin, chúng được XOR với nhau. Kết quả k bit vừa được đem truyền đi, vừa được bỏ lại vào đầu vào của thuật toán mã khối: vecto đầu vào được dịch trái k vị trí và k bit phải nhất sẽ được thay thế bởi k bit lấy từ gầu tin. Như vậy có thể thấy rằng thuật toán mã khối được thực hiện như một hàm sinh các số giả ngẫu nhiên k-bit, các gía trị này lại được XOR với các phần tử k-bit tin lấy vào để tạo ra mã truyền đi.Qua trình giải mã thì được tiến hành theo nguyên tắc đối xứng.Rõ ràng chế độ này cũng cung cấp các khả năng như của chế độ CBC, thêm vào đó nó cho phép truyền tin với khối ngắn tùy ý, đảm bảo các ứng dụng về truyền-xử lý liên tục. Chế độ mật mã kết quả phản hồi (Output Feedback Mode –OFB). Chế độ này cũng khá gần với hai chế độ trên đây, nhưng các phép XOR để tạo ra khối ciphertext là độc lập riêng rẽ, chứ không có sự phụ thuộc (móc xích) như trước. Các khối plaintext được XOR với các đầu ra – output – của các hàm sinh mã (thuật toán mật mã khối) mà riêng các phần tử output của hàm mã hóa này là vẫn phụ thuộc móc xích (nên được gọi là output feedback). Tuy nhiên chuỗi móc xích này có thể được thực hiện offline thông qua tiền xử lý, trước khi thực sự có thông tin văn bản cần gửi đi. Chính vì vậy khả năng thời gian tính toán có thể rút ngắn nhiều. Ngoài ra, chế độ này cũng cho phép mã khối nhỏ, như stream cipher, giống như với chế độ CFB vậy.