Code thuật toán mã hóa bằng ký số năm 2024
Lại một năm nữa qua đi và chúng ta lại già thêm 1 tuổi :v nói thế chứ chỉ có Tommy tui đây mới thấy bản thân mình già thôi, còn các bạn đọc ở đây thì chắc vẫn còn đang phơi phới lắm. Không sai chút nào khi tác giả Nguyễn Du đã miêu tả các bạn của tui là “Ngày xuân con én đưa thoi”, còn Tommy tui đây thì xin nhận phần “Thiều quang chín chục đã ngoài sáu mươi”, Haizzz… ☹
Đùa vậy thui chứ tui năm nay mới chỉ bước sang tuổi 18 thôi mà (lần thứ 7) Đàn ông con trai đầu đội trời chân đi dép tổ ong, dăm ba cái tuổi tác không thể cản nổi bước chân của nhà văn Tommy trên con đường chia sẻ kiến thức đến với các bạn đọc. Thế nên hôm nay sau một chuỗi ngày dài chỉ ăn với ngủ, tui lại ngoi lên đây để làm một bài viết khai xuân về chủ đề Mã hóa và Ký số nè. Không để mất nhiều thời gian nữa, chúng ta cùng bắt đầu thôi nào! 1. Mã hóa là gìCái tên nói lên tất cả, “mã hóa” có thể hiểu nôm na ra là “chuyển hóa” dữ liệu thành một chuỗi “mã” nhằm giữ cho những dữ liệu đó bí mật và an toàn khỏi những người không liên quan. Tất nhiên, những dữ liệu sau khi được “mã hóa” cũng phải đảm bảo điều kiện rằng tất cả những người có liên quan đều có thể lấy được dữ liệu gốc dựa vào chuỗi “mã” đã cho, và quá trình này được gọi là quá trình “giải mã” (tức là “hóa giải” chuỗi “mã” về dữ liệu gốc ban đầu).
Hãy chú ý để tránh bị nhầm lẫn với khái niệm “hàm băm” nhé. Hàm băm cũng là quá trình “chuyển hóa” dữ liệu thành một chuỗi “mã”, tuy nhiên chúng không cần đảm bảo điều kiện rằng người đọc có thể lấy được những dữ liệu gốc ban đầu dựa vào chuỗi “mã” đã cho. Có thể hiểu nôm na ra là “mã hóa” thì cần phải có “giải mã”, nhưng “hàm băm” thì không. Mặt khác, “hàm băm” yêu cầu tính duy nhất, tức là không bao giờ có trường hợp 2 dữ liệu khác nhau nhưng lại cho ra cùng một kết quả băm giống nhau. Nếu trường hợp này xảy ra, thuật toán của hàm băm đó sẽ được coi là không còn an toàn.
Cơ mà quay lại chủ đề chính nhé, về mã hóa thì hiện nay sẽ có 2 loại chính đó là “mã hóa đối xứng” và “mã hóa bất đối xứng”. Thực ra cũng sẽ còn nhiều kiểu mã hóa khác nữa, tuy nhiên hầu như chúng không còn thông dụng trong thời đại công nghệ phát triển như ngày nay. 1.1. Mã hóa đối xứngMã hóa đối xứng là một khái niệm ám chỉ các thuật toán mã hóa chỉ sử dụng một khóa duy nhất cho quá trình mã hóa và giải mã (hoặc là 2 khóa riêng biệt nhưng từ khóa này có thể dễ dàng tìm ra khóa kia). Tất nhiên vì quá trình mã hóa và giải mã chỉ dùng chung 1 khóa duy nhất nên khóa này không được phép công khai mà chỉ những người có quyền truy cập tới dữ liệu mã hóa mới được phép nắm giữ.
Tất nhiên cơ chế này cũng sẽ có những ưu điểm và hạn chế nhất định. Về ưu điểm, cơ chế mã hóa này sẽ cho ra độ trễ rất thấp. Theo thống kê, chúng ta chỉ cần mất khoảng vài giây để có thể mã hóa một dữ liệu nặng tới khoảng vài trăm MB. Các bạn có thể tự mình kiểm chứng bằng vài dòng code Python như sau: Đầu tiên là mã hóa (đầu vào của hàm mã hóa là đường dẫn tới file cần mã hóa, đầu ra sẽ là một chuỗi key):
Giải mã (đầu vào của hàm giải mã là khóa giải mã, dữ liệu đã được mã hóa, counter và đường dẫn lưu file sau khi giải mã):
Code trên sử dụng thuật toán AES 256, ngoài ra cũng còn rất nhiều các thuật toán mã hóa khác nhau với các đặc tính khác nhau mà bạn có thể lựa chọn sử dụng tùy thuộc vào nhu cầu của các bạn. Còn về nhược điểm, chính vì cơ chế này chỉ sử dụng 1 khóa duy nhất cho cả quá trình mã hóa và giải mã nên người dùng gặp rất nhiều vấn đề trong quá trình trao đổi khóa. Tính bí mật của khóa này còn phụ thuộc vào rất nhiều yếu tố như đường truyền có bị nghe lén hay không, người nhận có đang bị mạo danh hay không, trong tổ chức có tồn tại thành viên nào đạo đức kém hay không... Mặc dù vậy, nhờ ưu điểm về độ trễ thấp nên các thuật toán mã hóa đối xứng vẫn rất được tin dùng khi sử dụng để mã hóa các dữ liệu lớn. 1.2. Mã hóa bất đối xứngKhác với mã hóa đối xứng, mã hóa bất đối xứng ám chỉ các thuật toán mã hóa sử dụng khóa mã hóa và khóa giải mã khác biệt hoàn toàn, trong đó khóa mã hóa sẽ được công khai hoàn toàn (Public key), còn khóa giải mã thì sẽ chỉ có người nhận giữ (Private key). Tất nhiên, dù có trong tay Public Key thì kẻ gian cũng không bao giờ có thể tìm ra được Private key. Về cơ chế hoạt động, giả sử một người A muốn gửi dữ liệu cho người B thì sẽ cần thực hiện những bước cơ bản sau:
Còn nếu B muốn gửi dữ liệu cho A thì cũng thực hiện hoàn toàn ngược lại, và lúc này thì A sẽ cần phải có một cặp khóa Public - Private key tương ứng.
Ngược lại hoàn toàn so với mã hóa đối xứng, mã hóa bất đối xứng an toàn hơn rất nhiều do người dùng không cần phải trao đổi khóa bí mật cho nhau mà vẫn đảm bảo dữ liệu gửi đi được mã hóa và giải mã đầy đủ. Còn về nhược điểm thì sao, hẳn là các bạn cũng đã đoán ra được rồi )) Một thuật toán an toàn hơn thì hiển nhiên là độ trễ sẽ cao hơn và tiêu tốn năng lực tính toán của phần cứng hơn rất nhiều rồi! Làm vài dòng code Python cho đỡ buồn nhé! Đầu tiên là hàm tạo cặp khóa Public – Private key (passphrase giống như một password chúng ta đặt ra để bảo vệ cặp khóa của mình):
Tiếp theo là hàm mã hóa file. Đầu vào của hàm này lần lượt là: Đường dẫn file cần mã hóa; đường dẫn lưu dữ liệu đã mã hóa; khóa công khai và passphrase:
Hàm giải mã cũng cần các thông tin tương ứng như khóa bí mật, đường dẫn file đã mã hóa, passphrase và đường dẫn lưu dữ liệu giải mã:
Thuật toán mà tui sử dụng ở trên là thuật toán RSA, đây là một thuật toán đã phổ biến từ xưa nay rồi ) Ngoài ra hiện nay còn rất nhiều các thuật toán tân tiến hơn mà các bạn có thể sử dụng như ECDSA hay EdDSA (các thuật toán về đường cong Eliptic)… Được rồi, tiếp theo là đến Ký số nào ) 2. Ký số là gìCũng đúng như tên gọi, “ký số” có thể được hiểu nôm na là một “chữ ký” đã được “số hóa” để tránh bị giả mạo. Về phương thức thực hiện, ký số sẽ ngược lại một chút so với các thuật toán mã hóa bất đối xứng. Đối với mã hóa, chúng ta sẽ sử dụng khóa công khai (Public key) để mã hóa và khóa bí mật (Private key) để giải mã. Còn trong ký số, chúng ta sẽ sử dụng khóa bí mật để ký số và sử dụng khóa công khai để xác thực chữ ký.
Ngoài ra trong quá trình ký số thì thường các tổ chức hoặc cá nhân sẽ thêm một cơ chế để hỗ trợ người nhận kiểm tra tính toàn vẹn của dữ liệu, mà phương pháp phổ biến nhất đó là sử dụng checksum. Tuy nhiên checksum sẽ chỉ phù hợp với các dữ liệu vừa và nhỏ, bởi tính chống đụng độ của chúng thấp (tính chống đụng độ ám chỉ việc không bao giờ có 2 dữ liệu khác nhau mà lại có kết quả checksum giống nhau), và ở thời điểm hiện tại thì hàm băm sẽ là cơ chế được tin dùng hơn cho mục đích này. Lại làm vài dòng code cho đỡ buồn chứ nhỉ Ký số cũng sử dụng một cặp khóa Public – Private key, vậy nên code để tạo khóa thì các bạn tham khảo trong phần trước nhé. Tiếp theo là code để ký số và xác thực chữ ký. Đầu vào của hàm ký số gồm khóa bí mật, file cần ký số, passphrase và đầu ra để lưu chữ ký. Đầu vào của hàm xác thực gồm khóa công khai, file cần xác thực, chữ ký và passphrase:
3. Lời kếtOkay, đầu xuân năm mới nên tui làm một bài kỹ thuật nhẹ nhàng vậy thôi, chứ mấy ông đầu óc còn toàn mùi bánh chưng với thịt gà thì nhét sao cho nổi nữa. Nói thật chứ Tommy tui vẫn còn đang tâm hồn ăn tết lắm, hết tháng giêng mới là hết tết cơ mà :v Thôi thì cũng là dịp khai xuân, chúc ae có một năm mới thuận lợi và gặp nhiều may mắn nhé )) |