Các khái niệm base16 (hex), base32, base64, và base85 là các thuật toán mã hóa dữ liệu. Các thuật toán này được định nghĩa trong RFC 4648
Mỗi thuật toán có cách mã hóa và giải mã dữ liệu khác nhau. Các thuật toán này thường được sử dụng để mã hóa các tệp tin nhị phân, email, hoặc các thông tin khác trước khi truyền đi qua mạng hoặc lưu trữ.
Data Encryption Algorithm (DES) là một thuật toán khóa đối xứng được sử dụng để mã hóa.
Thuật toán DES bao gồm 16 vòng xử lý dữ liệu với 16 khóa vòng trung gian 48 bit được tạo từ khóa mật mã 56 bit bởi Bộ tạo khóa vòng. Tương tự, mật mã đảo ngược DES tính toán dữ liệu ở định dạng văn bản rõ ràng từ văn bản mật mã bằng cách sử dụng cùng một khóa mật mã.
Advanced Encryption Standard (AES) là một thuật toán đối xứng khóa riêng nhưng mạnh hơn và nhanh hơn Triple-DES. Nó có thể mã hóa dữ liệu 128 bit với khóa 128/192/256 bit.
Thư viện PyCryptodome là 1 package python chứa các yếu tố mã hóa low-level.
Pycryptodome là một phiên bản của PyCrypto. Nó mang lại nhiều cải tiến so với phiên bản chính thức cuối cùng của PyCrypto, ví dụ như:
OpenSSL là một tiện ích nguồn mở được sử dụng để mã hóa dữ liệu. Nó cho phép tạo khóa RSA, DH, DSA,… và mã hóa dữ liệu với kết nối SSL/TLS. Đây là công cụ mã nguồn mở có sẵn trên Windows, Linux, Solaris, macOS, QNX và nhiều hệ điều hành khác
Bao gồm các phần mềm nguồn mở cho phép triển khai các giao thức mạng và mã hóa dữ liệu khác nhau như SSL và TLS. Thư viên gốc của phần mềm này được viết bằng ngôn ngữ lập trình C.Trong đó có sẵn những phần mềm cho phép người dùng sử dụng thư viện OpenSSL với nhiều nguôn ngữ khác nhau cùng với các chức năng mật mã tổng quát để có thể mã hóa và giải mã dữ liệu. OpenSSL cũng được sử dụng từ dòng lệnh để có thể yêu cầu, tạo và quản lý các chứng thực số.
GPG (hoặc GNU Privacy Guard), là một ứng dụng mã hóa khoá công khai, cho phép truyền tải thông tin giữa các bên an toàn và có thể được sử dụng để xác minh nguồn gốc của một thông điệp là chính chủ hay không
Cách thức làm việc của khóa công khai mã hóa (Public Key Encryption):
Đảm bảo rằng chỉ có người dùng được chỉ định mới có thể đọc
Hệ thống này cho phép tạo và mã hóa thông điệp một chiều bằng bất kỳ khóa nào, nhưng chỉ có thể được giải mã bởi người dùng được chỉ định thông qua khóa giải mã riêng. Nếu cả hai bên tạo cặp khóa (công khai và riêng), và chia sẻ khóa mã hóa công khai của họ cho nhau, họ có thể mã hóa và truyền thông điệp an toàn.
Xác nhận tính xác thực của người gửi
Flag bài này là crypto{y0ur_f1rst_fl4g}
, chủ yếu giới thiệu format của flag ra sao.
Bài này chỉ cần mình run cái file py được cho sẵn thì tìm được flag là crypto{z3n_0f_pyth0n}
Mình dùng đoạn code dưới để chuyển từ ASCII -> Dec thì tìm được flag là crypto{ASCII_pr1nt4bl3}
Mình cùng dùng đoạn code dưới để decode hex thì được flag là crypto{You_will_be_working_with_hex_strings_a_lot}
Dùng đoạn code dưới để decode base64 (đề gợi ý mình decode hex trước sau đó tới base64) và tìm được flag là crypto/Base+64+Encoding+is+Web+Safe/
Khóa RSA chỉ work với số. Bài này đề đã cung cấp cho mình messages sẵn dưới dạng số rồi nên chỉ cần apply vô.
Flag bài này là crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}
Bài này là về XOR, với mỗi ký tự a trong chuỗi A, thực hiện phép XOR với số 13, sau đó chuyển kết quả thành ký tự tương ứng và thêm vào chuỗi flag.
Flag tìm được là crypto{aloha}
Cứ lấy mấy key xor với nhau theo thứ tự thì tìm được flag. Hàm unhexlify
từ thư viện binascii
là dùng để chuyển đổi một chuỗi hex thành dạng nhị phân.
Flag bài này là crypto{x0r_i5_ass0c1at1v3}
Bài này là single byte - xor, vậy nên mình phải xor từng byte với nhau, lặp đi lặp lại cho tới hết thì mới tìm được flag.
Flag bài này làcrypto{0x10_15_my_f4v0ur173_by7e}
Bài này đề gợi ý mình nhớ lại format flag là crypto{
(7 char). Vậy thì lấy nó đi xor với 7 char đầu trong cipher (data sau khi chuyển về nhị phân). Thì tìm được 1 cái key mới là myXORke
, nhưng mà cái key này còn thiếu chữ y nên mình phải tự add vào. Sau đó mình lặp đi lặp cái key myXORkey
sao cho nó dài bằng cái cipher, rồi đem đi xor với nhau thì tìm được flag.
Flag bài này là crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}
Giải mã đoạn ciphertext mã hoá bằng AES-128 mode CBC sau sử dụng CyberChef + Code (viết cả 2 cách giải):
Flag bài này là KCSC{ma_hoa_hay_ko_e}
CyberChef:
Code
Đầu tiên mình import thư viện Pycryptodome. Sau đó đổi chuỗi base64 kia thành bytes.
Tạo đối tượng AES.new
với key và iv.
Sử dụng cipher.decrypt
để giải mã và unpad
để loại bỏ các bytes được thêm vào để đảm bảo kích thước block đúng. Cuối cùng nhập các info đã cho key,iv,ciphertext
để decode.
Trong tập tin "bai2.zip", đọc bash và kết hợp với những gì đã tìm hiểu về openssl, hãy giải mã flag.enc và phục hồi file gốc.
Đây là bash đã cho
Mình dùng openssl để decrypt
openssl enc -aes-256-cbc -d -in flag.enc -out flag.xlsx -K $key2 -iv d14cc2932227ad3eb8354fc18057b292
Thu được flag.xlsx
, file này có PK nên đổi thành .zip
. Sau đó unzip, vào sharedStrings.xml
thì tìm được 1 chuỗi ngăn cách bằng tên Long, Quoc,Kiet,Phuc,Loi, ghép lại ta được S0NTQ3tzYXVfbmF5X2Nob2lfZm9yX3NlX2dhcF9yYXRfbmhpZXVfbWFfaG9hX25odV90aGVfbmF5fQ==
và đem đi decode base64 thì được flag
Flag bài này là
KCSC{sau_nay_choi_for_se_gap_rat_nhieu_ma_hoa_nhu_the_nay}
Trong tập tin "bai3.zip". Làm bằng CyberChef và sửa đổi source được cho để giải mã (hoặc tự code mới nếu thích hehe).
Mình thêm đoạn code decrypt vào source có sẵn
Sau đó decrypt 2 file là docvippro.docx.kcsc
và hinhvippro.jpg.kcsc
lần lượt thành 2 file output.txt
và output1.txt
File mở file output.txt
có PK
thì mình đổi đuôi thành zip, output1.txt
có jfif
thì đổi đuôi thành png, mình được tấm hình
Unzip file output
, sau đó vào file document.xml
cũng thấy chuỗi kí tự base85 91)WFH['IHB4#ahF),-#@<l4%BPCgqBk;6jFD,6(?ZTdcCgg[m@<63kFDl&0?YF@s?Z'Og?Y+(]BOtjg/73:.DdRF#?XdGXI/
decode xong thì tìm được flag.
Flag bài này là