![](https://blog.crfnetwork.com/wp-content/uploads/2023/06/download.jpg)
Thuật ngữ
Trước khi bắt đầu, bạn cần có hiểu biết về 1 số thuật ngữ về mã hoá trước.
Lưu ý: Tất cả những keyword chuyên ngành tôi sẽ giữ nguyên dưới dạng tiếng Anh thay vì dịch sang tiếng Việt vì nó rất chuối và nhiều từ giống nghĩa nhau.
- Ciphertext (Bản mã) – Kết quả của việc encrypt plaintext, dữ liệu mã hoá
- Cipher (Mật mã) – Các phương pháp encrypt/decrypt dữ liệu.
- Cryptographic (mật mã học) – Ngày nay, cipher được gọi là cryptographic, nhưng vẫn còn nhiều loại không phải cryptographic ciphers như Caesar.
- Plaintext (Bản rõ) – Dữ liệu trước mã hoá, có thể là chữ, ảnh hoặc các loại file
- Encryption (Mã hoá) – Cách chuyển dữ liệu thành ciphertext, sử dụng cipher.
- Encode (Mã hoá) – Không phải encryption, chỉ là một hình thức biểu diễn dữ liệu như base64. Có thể đảo ngược bằng Decode (Giải mã).
- Key (Khoá) – Các thông tin cần thiết để decrypt ciphertext và nhận được plaintext.
- Passphrase (cụm mật khẩu) – Khác với key, passphrase giống dạng password và được sử dụng để bảo vệ key.
- Asymmetric encryption (Mã hoá bất đối xứng) – Sử dụng các key khác nhau để encrypt và decrypt.
- Symmetric encryption (Mã hoá đối xứng) – Sử dụng các key giống nhau để encrypt và decrypt.
- Brute force (Dò mật khẩu) – Tấn công cryptography bằng cách thử mọi password và key khác nhau.
- Cryptanalysis (Phân tích mật mã) – Tấn công cryptography bằng cách tìm ra một điểm yếu trong toán học.
Tại sao Mã hóa lại quan trọng?
Cryptography được sử dụng để bảo vệ bí mật, đảm bảo tính toàn vẹn và xác thực. Rất có thể bạn sử dụng cryptography hàng ngày và gần như chắc chắn bạn đang đọc nội dung này ngay bây giờ qua một kết nối được mã hóa.
- Khi đăng nhập vào CRF Blog, thông tin đăng nhập của bạn đã được gửi đến máy chủ. Chúng đã được mã hóa, nếu không ai đó sẽ có thể bắt được chúng bằng cách nghe lén kết nối của bạn.
- Khi bạn kết nối với SSH, máy khách và máy chủ của bạn sẽ thiết lập một đường hầm được mã hóa để không ai có thể theo dõi phiên của bạn.
- Khi bạn kết nối với ngân hàng, sẽ có một chứng chỉ sử dụng mật mã để chứng minh rằng đó thực sự là của bạn chứ không phải tin tặc.
- Khi bạn tải xuống một tệp, làm cách nào để bạn kiểm tra xem nó đã tải đúng chưa? Bạn có thể sử dụng cryptography để xác minh kiểm tra dữ liệu.
- Bạn hiếm khi phải tương tác trực tiếp với cryptography, nhưng nó âm thầm bảo vệ hầu hết mọi thứ bạn làm trên kỹ thuật số.
Bất cứ khi nào dữ liệu nhạy cảm của người dùng cần được lưu trữ, dữ liệu đó phải được mã hóa. Các tiêu chuẩn như PCI-DSS nêu rõ rằng dữ liệu phải được mã hóa cả ở trạng thái nghỉ (trong bộ lưu trữ) và trong khi được truyền đi. Với các luật như GDPR và bảo vệ dữ liệu của California, vi phạm dữ liệu cực kỳ tốn kém và nguy hiểm đối với bạn với tư cách là người tiêu dùng hoặc doanh nghiệp.
Toán học trong mật mã
Có một chút toán học xuất hiện tương đối thường xuyên trong cryptography, đó là toán tử Modulo. Gần như mọi ngôn ngữ lập trình đều triển khai toán tử này hoặc có sẵn trong thư viện.
Khi bạn cần làm việc với số lượng lớn, hãy sử dụng ngôn ngữ lập trình. Python rất tốt cho việc này vì các số nguyên có kích thước không giới hạn và bạn có thể dễ dàng có được một trình thông dịch.
![](https://blog.crfnetwork.com/wp-content/uploads/2023/06/image-5.png)
Khi học phép chia lần đầu tiên, có lẽ bạn đã được dạy sử dụng số dư trong câu trả lời của mình. X % Y là phần còn lại khi chia X cho Y.
Một điều quan trọng cần nhớ về modulo là nó không thể đảo ngược. Nếu tôi đưa cho bạn một phương trình: x % 5 = 4, thì có vô số giá trị của x sẽ đúng.
Các loại mã hóa
Có hai loại Mã hóa chính là mã hoá đối xứng và bất đối xứng.
- Symmetric encryption (Mã hóa đối xứng) sử dụng cùng một khóa để mã hóa và giải mã dữ liệu.
- Asymmetric encryption (Mã hóa bất đối xứng) sử dụng một public key và private key, một khóa để mã hóa và khóa còn lại trong cặp để giải mã. Dữ liệu được mã hóa bằng private key có thể được giải mã bằng public key và ngược lại. Private key của bạn cần được giữ kín.
Ví dụ về Mã hóa đối xứng là DES (Broken) và AES. Các thuật toán này có xu hướng nhanh hơn mã hoá bất đối xứng và sử dụng các khóa nhỏ hơn (khóa 128 hoặc 256 bit cho AES, khóa DES dài 56 bit).
Ví dụ về Mã hóa bất đối xứng là RSA và Elliptic Curve. Mã hóa bất đối xứng có xu hướng chậm hơn và sử dụng các khóa lớn hơn, chẳng hạn như RSA thường sử dụng các khóa từ 2048 đến 4096 bit.
RSA – Rivest Shamir Adleman
Về mặt toán học
RSA dựa trên bài toán khó về mặt toán học tìm ra thừa số của một số lớn. Rất nhanh chóng để nhân hai số nguyên tố với nhau, chẳng hạn như 17*23 = 391, nhưng khá khó để tìm ra hai số nguyên tố nào nhân với nhau để tạo thành 14351 (113×127 để tham khảo).
Về mặt tấn công
Các phép toán đằng sau RSA dường như xuất hiện tương đối thường xuyên trong CTF, thường yêu cầu bạn tính toán các biến hoặc phá vỡ một mã hóa RSA. Trang wikipedia về RSA thoạt nghe có vẻ phức tạp, nhưng sẽ cung cấp cho bạn gần như tất cả thông tin bạn cần để hoàn thành các thử thách.
Các biến chính mà bạn cần biết về RSA trong CTF là p, q, m, n, e, d và c.
- “p” và “q” là các số nguyên tố lớn, “n” là tích của p và q.
- Khóa chung là n và e, khóa riêng là n và d.
- “m” được sử dụng để biểu thị thông điệp và “c” biểu thị bản mã.
Thiết lập khóa bằng mã hoá bất đối xứng
Một cách sử dụng rất phổ biến của mật mã bất đối xứng là trao đổi khóa để mã hóa đối xứng. Mã hóa bất đối xứng có xu hướng chậm hơn, vì vậy đối với những thứ như mã hóa đối xứng HTTPS sẽ tốt hơn.
Nhưng câu hỏi đặt ra là làm thế nào để bạn đồng ý một key với máy chủ mà không truyền key cho những người rình mò xem?
Ví dụ
- Hãy tưởng tượng bạn có một secret code và hướng dẫn sử dụng. Nếu bạn muốn gửi hướng dẫn cho bạn mình mà không ai khác có thể đọc được, điều bạn có thể làm là nhờ bạn mình khóa.
- Chỉ họ mới có chìa khóa cho ổ khóa này và chúng tôi sẽ cho rằng bạn có một chiếc hộp không thể phá hủy mà bạn có thể khóa bằng nó.
- Nếu bạn gửi hướng dẫn trong hộp bị khóa cho bạn bè của mình, họ có thể mở khóa sau khi hộp đến tay họ và đọc hướng dẫn.
- Sau đó, bạn có thể giao tiếp bằng secret code mà không có nguy cơ bị mọi người rình mò.
Trong phép ẩn dụ này, mã bí mật đại diện cho khóa mã hóa đối xứng, khóa đại diện cho khóa chung của máy chủ và khóa đại diện cho khóa riêng của máy chủ.
Bạn chỉ mới sử dụng mật mã bất đối xứng một lần, vì vậy nó rất nhanh và giờ đây bạn có thể liên lạc riêng tư với mã hóa đối xứng.
Trên thực tế, bạn cần thêm một chút mật mã để xác minh người mà bạn đang nói chuyện chính là họ, điều này được thực hiện bằng chữ ký số (signatures) và chứng chỉ (certificates). Bạn có thể tìm thấy chi tiết hơn về cách HTTPS thực sự hoạt động.
Chữ ký số và chứng chỉ
Chữ ký số là gì?
Chữ ký số là một cách để chứng minh tính xác thực của tệp, để chứng minh ai đã tạo hoặc sửa đổi chúng. Sử dụng mã hoá bất đối xứng, bạn tạo chữ ký bằng khóa riêng và nó có thể được xác minh bằng khóa chung. Vì chỉ bạn mới có quyền truy cập vào khóa riêng tư của mình, điều này chứng tỏ bạn đã ký vào tệp.
Hình thức đơn giản nhất của chữ ký số là mã hóa tài liệu bằng khóa riêng, sau đó nếu ai đó muốn xác minh chữ ký này, họ sẽ giải mã nó bằng khóa chung của bạn và kiểm tra xem các tệp có khớp không.
Chứng chỉ – Chứng minh bạn là ai!
Chứng chỉ cũng là một cách sử dụng chính của mật mã khóa công khai, được liên kết với chữ ký số. Một nơi phổ biến mà chúng được sử dụng là dành cho HTTPS. Làm cách nào để trình duyệt web của bạn biết rằng máy chủ mà bạn đang nói chuyện là CRF Blog thật hay không?
Câu trả lời là chứng chỉ. Máy chủ web có chứng chỉ cho biết đó là CRF Blog thực. Các chứng chỉ có một chuỗi tin cậy, bắt đầu bằng một CA gốc (cơ quan cấp chứng chỉ). Root CA được thiết bị, hệ điều hành hoặc trình duyệt của bạn tự động tin cậy khi cài đặt. Các chứng chỉ bên dưới được tin cậy vì Root CA cho biết họ tin tưởng tổ chức đó. Các chứng chỉ bên dưới được tin cậy vì tổ chức được Root CA tin cậy, v.v. Có những chuỗi dài tin tưởng.
Bạn có thể nhận chứng chỉ HTTPS của riêng mình cho các miền mà bạn sở hữu bằng Let’s Encrypt miễn phí. Nếu bạn điều hành một trang web, bạn nên thiết lập nó.
Xác thực SSH
Mã hóa và xác thực SSH
Theo mặc định, SSH được xác thực bằng tên người dùng và mật khẩu giống như cách bạn đăng nhập vào máy vật lý.
Đôi khi bạn sẽ thấy một số máy được cấu hình xác thực SSH bằng khóa. Điều này sử dụng khóa chung và khóa riêng để chứng minh rằng máy khách là người dùng hợp lệ và được ủy quyền trên máy chủ. Theo mặc định, khóa SSH là khóa RSA. Bạn có thể chọn thuật toán sẽ tạo và/hoặc thêm cụm mật khẩu để mã hóa khóa SSH. ssh-keygen là chương trình được sử dụng để tạo các cặp khóa hầu hết thời gian.
SSH Private Keys
Bạn nên coi các khóa riêng của mình giống như mật khẩu. Đừng chia sẻ chúng, chúng được gọi là khóa riêng là có lý do. Nếu ai đó có khóa riêng của bạn, họ có thể sử dụng khóa đó để đăng nhập vào các máy chủ sẽ chấp nhận khóa đó trừ khi khóa được mã hóa.
Điều rất quan trọng cần đề cập là cụm mật khẩu để giải mã khóa hoàn toàn không được sử dụng để nhận dạng bạn với máy chủ, tất cả những gì nó làm là giải mã khóa SSH. Cụm mật khẩu không bao giờ được truyền đi và không bao giờ rời khỏi hệ thống của bạn.
Sử dụng các công cụ như John the Ripper, bạn có thể tấn công khóa SSH được mã hóa để cố gắng tìm cụm mật khẩu, điều này làm nổi bật tầm quan trọng của việc sử dụng cụm mật khẩu an toàn và giữ khóa riêng của bạn ở chế độ riêng tư.
Khi tạo khóa SSH để đăng nhập vào máy từ xa, bạn nên tạo khóa trên máy của mình rồi sao chép khóa chung vì điều này có nghĩa là khóa riêng không bao giờ tồn tại trên máy đích. Đối với các khóa tạm thời được tạo để truy cập vào các CTF, điều này không quan trọng bằng.
Làm cách nào để sử dụng các khoá này?
Thư mục ~/.ssh là nơi mặc định để lưu trữ các khóa này cho OpenSSH. Tệp authorized_keys trong thư mục này chứa các khóa công khai được phép truy cập máy chủ nếu xác thực khóa được bật. Theo mặc định trên nhiều bản phân phối, xác thực khóa được bật vì nó an toàn hơn so với sử dụng mật khẩu để xác thực. Thông thường đối với người dùng root, chỉ xác thực khóa được bật.
Để sử dụng khóa riêng, các quyền phải được thiết lập chính xác, nếu không ứng dụng khách SSH của bạn sẽ bỏ qua các cảnh báo. Chỉ chủ sở hữu mới có thể đọc hoặc ghi vào khóa riêng (600 hoặc nghiêm ngặt hơn). ssh -i <privatekey> user@host là cách bạn chỉ định khóa cho máy khách Linux OpenSSH tiêu chuẩn.
Sử dụng các khóa SSH để có shell tốt hơn
Các khóa SSH là một cách tuyệt vời để “nâng cấp” một reverse shell, giả sử người dùng đã bật đăng nhập. Để lại khóa SSH trong authorized_keys có thể là một backdoor và bạn không cần phải xử lý bất kỳ vấn đề nào về reverse shells không ổn định như Control-C hoặc thiếu tab completion.
Giải thích Diffie Hellman Key Exchange
Trao đổi khóa là gì?
Trao đổi khóa cho phép các bên thiết lập một bộ khóa mật mã chung mà không có người nào khác có thể lấy được các khóa này. Nói chung, để thiết lập các khóa đối xứng chung.
Trao đổi khóa Diffie Hellman hoạt động như thế nào?
Giả sử Alice và Bob muốn nói chuyện một cách an toàn. Họ muốn thiết lập một khóa chung để có thể sử dụng mật mã đối xứng, nhưng họ không muốn sử dụng trao đổi khóa với mật mã bất đối xứng. Đây là nơi trao đổi khóa DH xuất hiện.
Cả Alice và Bob đều có những bí mật mà họ tạo ra, hãy gọi đây là A và B. Họ cũng có một số tài liệu chung được công khai, hãy gọi đây là C.
Chúng ta cần đưa ra một số giả định. Thứ nhất, bất cứ khi nào chúng ta kết hợp các bí mật/tài liệu thì không thể hoặc rất rất khó tách rời. Thứ hai, thứ tự chúng được kết hợp không thành vấn đề.
Alice và Bob sẽ kết hợp bí mật của họ với tài liệu chung và tạo thành AC và BC. Sau đó, họ sẽ gửi chúng cho nhau và kết hợp điều đó với bí mật của họ để tạo thành hai khóa giống hệt nhau, cả hai đều là ABC. Bây giờ họ có thể sử dụng khoá này để giao tiếp.
PGP, GPG và AES
PGP là gì?
PGP là viết tắt của Pretty Good Privacy (Quyền riêng tư khá tốt). Đây là phần mềm triển khai mã hóa để mã hóa tệp, thực hiện ký điện tử, v.v.
GPG là gì?
GnuPG hoặc GPG là một triển khai PGP Nguồn mở từ dự án GNU. Bạn có thể cần sử dụng GPG để giải mã các tệp trong CTF. Với PGP/GPG, khóa riêng có thể được bảo vệ bằng cụm mật khẩu theo cách tương tự như khóa riêng SSH.
AES là gì?
AES, đôi khi được gọi là Rijndael theo tên người tạo ra nó, là viết tắt của Advanced Encryption Standard. Nó là sự thay thế cho DES có khóa ngắn và các lỗi mã hóa khác. Cả AES và DES đều hoạt động trên các khối dữ liệu (khối là một chuỗi bit có kích thước cố định).
Tương lai – Máy tính lượng tử và mã hóa
Máy tính lượng tử sẽ sớm trở thành vấn đề đối với nhiều loại mã hóa.
Bất đối xứng và lượng tử
Mặc dù không chắc chúng ta sẽ có các máy tính lượng tử đủ mạnh cho đến khoảng năm 2030, nhưng một khi các mã hóa tồn tại này sử dụng RSA hoặc Elliptical Curve sẽ rất nhanh bị phá vỡ. Điều này là do máy tính lượng tử có thể giải quyết rất hiệu quả các vấn đề toán học mà các thuật toán này dựa vào sức mạnh của chúng.
AES/DES và Lượng tử
AES với các khóa 128 bit cũng có khả năng bị máy tính lượng tử phá vỡ trong tương lai gần, nhưng AES 256 bit không thể bị phá vỡ dễ dàng như vậy. Triple DES cũng dễ bị tấn công từ máy tính lượng tử.
Khuyến nghị hiện tại
NSA khuyến nghị sử dụng RSA-3072 trở lên cho mã hóa bất đối xứng và AES-256 trở lên cho mã hóa đối xứng. Có một số cuộc thi hiện đang diễn ra cho các thuật toán mã hóa an toàn lượng tử và có khả năng chúng ta sẽ có một tiêu chuẩn mã hóa mới trước khi máy tính lượng tử trở thành mối đe dọa đối với RSA và AES.