Trong toán học, một nhóm (group) là một tập hợp các phần tử được trang bị một phép toán hai ngôi kết hợp hai phần tử bất kỳ của tập hợp thành một phần tử thứ ba thỏa mãn bốn điều kiện gọi là tiên đề nhóm, lần lượt là tính đóng, tính kết hợp, sự tồn tại của phần tử đơn vị và tính khả nghịch. Một trong những ví dụ quen thuộc nhất về nhóm đó là tập hợp các số nguyên cùng với phép cộng; khi thực hiện cộng hai số nguyên bất kỳ luôn thu được một số nguyên khác. Hình thức trình bày trừu tượng dựa trên tiên đề nhóm, tách biệt nó khỏi bản chất cụ thể của bất kỳ nhóm đặc biệt nào và phép toán trên nhóm, cho phép nhóm bao trùm lên nhiều thực thể với nguồn gốc toán học rất khác nhau trong đại số trừu tượng và rộng hơn, và có thể giải quyết một cách linh hoạt, trong khi vẫn giữ lại khía cạnh cấu trúc căn bản của những thực thể ấy. Sự có mặt khắp nơi của nhóm trong nhiều lĩnh vực bên trong và ngoài toán học khiến chúng trở thành nguyên lý tổ chức trung tâm của toán học đương đại.
Trong đại số trừu tượng, một nhóm (group) là một tập hợp các phần tử kèm theo một phép toán nhất định trên tập hợp đó, thỏa mãn các tính chất sau:
Như vậy, một nhóm bao gồm một tập hợp các phần tử và một phép toán trên tập hợp đó, thỏa mãn các tính chất kết hợp, phần tử đơn vị và phần tử nghịch đảo. Các nhóm rất quan trọng trong đại số trừu tượng và được sử dụng rộng rãi trong nhiều lĩnh vực của toán học và khoa học khác.
Order (Bậc) của một nhóm (Group) là số lượng phần tử trong nhóm đó. Bậc của một nhóm thường được ký hiệu bằng cấp của nhóm và thường được ký hiệu là |G|.
Ví dụ, nhóm là nhóm tất cả các phần tử nguyên tố cùng với phép toán cộng theo modulo . Bậc của nhóm là , vì nó có phần tử.
Như vậy, việc tính bậc của một nhóm là rất quan trọng trong đại số trừu tượng và có thể được sử dụng để xác định tính chất của các nhóm và giải các bài toán liên quan đến nhóm.
Order (bậc) của một nhóm (Group) còn có một số tính chất quan trọng như sau:
Định lý Lagrange: Nếu H là một nhóm con của G, thì bậc của H phải chia hết cho bậc của G. Cụ thể hơn, nếu |G| = m và |H| = n, thì n phải chia hết cho m.
Theo định lý Euler, nếu a và n là hai số nguyên tố cùng nhau, thì bậc của nhóm là , trong đó là hàm số Euler, biểu thị số lượng số nguyên tố nhỏ hơn n. Nói cách khác, || = .
Những nhóm có bậc là số nguyên tố chỉ có hai nhóm con là {e} và chính nó. Những nhóm này được gọi là nhóm nguyên tố hoặc nhóm Abel nguyên tố.
Nếu bậc của một nhóm là số nguyên tố, thì nhóm đó phải là nhóm Abel.
Nhóm có bậc là một số chính phương không nhất thiết là nhóm Abel. Ví dụ, nhóm đơn vị bình phương (nhóm các phần tử trong đó có bậc là bốn) không phải là nhóm Abel.
Những tính chất này giúp cho việc nghiên cứu và xác định tính chất của các nhóm trong đại số trừu tượng trở nên dễ dàng hơn.
Challenge cho p = 991 , g = 209
Yêu cầu tìm d là nghịch đảo của g mod p ( g*d mod 991 = 1
)
Đáp án là 569
Challenge yêu cầu tìm phần tử sinh nhỏ nhất trên trường với p = 28151
Brute-force bằng python
Hoặc có thể dùng sage
Đáp án là g = 7
Challenge yêu cầu tính mod
Kết quả là 1806857697840726523322586721820911358489420128129248078673933653533930681676181753849411715714173604352323556558783759252661061186320274214883104886050164368129191719707402291577330485499513522368289395359523901406138025022522412429238971591272160519144672389532393673832265070057319485399793101182682177465364396277424717543434017666343807276970864475830391776403957550678362368319776566025118492062196941451265638054400177248572271342548616103967411990437357924
Challenge yêu cầu tính shared secret
Challenge cho 2 file python code source.py để mã hóa và decrypt.py để giải mã nhưng source code file decrypt.py còn thiếu giá trị của share_secret
,iv
và ciphertext
Với iv
và cipher
bài cho kết hợp với share_secret
tính theo cách của challenge trước ta có thể tìm được flag
Flag: crypto{sh4r1ng_s3cret5_w1th_fr13nd5}
Đầu tiên,gửi cho Bob một bộ g,p,A bất kì không quan tâm phản hồi của Bob.Tiếp theo gửi B = "0x01" khi này share_secret = B^a mod p .Vì B = 1 nên share_secret cũng sẽ bằng 1 với mọi a.Sau khi có được share_secret ,iv,ciphertext ta có thể tìm được flag
Flag: crypto{n1c3_0n3_m4ll0ry!!!!!!!!}
Khi kết nối đến địa chỉ của challenge ta thấy các kiểu hỗ trợ DH1536,DH1024,DH512,DH128,DH64. Ta chọn thử DH64 .System trả về khóa công khai của Alice ,có thể thấy p ở đây tương đối nhỏ
Theo công thức A = ga mod p ,có thể tìm được a khi đã biết g,A,p bằng cách sử dụng thuật toán Pohlig-Hellman
Flag: crypto{d0wn6r4d35_4r3_d4n63r0u5}
Khi kết nối đến hệ thống ,hệ thống cho 1 bộ khóa công khai của Alice, tiêu đề challenge cho thấy Alice và Bob đã sử dụng khóa bí mật tĩnh trong quá trình tạo khóa.Khi gửi khóa công Khai của Alice Bob sẽ gửi lại khóa Công khai của anh ta B .Khi chúng ta gửi cho Bob giá trị của khóa công khai của Alice với g = A . Bob sau đó sẽ tính toán và gửi cho chúng ta bí mật được chia sẻ.
Ta có B = gb (mod p) và s = Ab (mod p) ;
đặt g = A thì B = Ab (mod p) và B = s
Gửi lại cho Bob :{"p": "0xffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff", "g": "0x53adb6626ed68ed83e3b9689e66f3f750be072a139ad656e1b81288eeb4bc62641617dd6355e5c55ae2831725248547ae85c130382b8a36a29def045b9a7c502689481649bc7a6f49beea37d4264378a05839a7461e74952ccb0f86eb5541dc87c4a1aa0b26c81dc1fdc7266a339a329df35e378627eb6fbdc4961e1b376e74bfe31c459df77e07cd6af63f8fd3c86be461fa532e3c1ecbc398bfa783ab11c8473c9354cad5e91a1f7830e8f6323b152993d70d602ba28e251c76bc7a57cfeaf", "A": "0x01"}
Thu được shared_secret = 0xab76f5e66eb3c21e6b5670e0adbbd257e17b0494a89758f63a242ef8be080fb32984c685569accf111a1d52bc62ea9c3d22a866d653f94bde45e8dd1c5b69c56a8a5687e0de2bac44bfa2b98637a3fca62c0b5b59fe9099170afcc0c6c5c2f42bf44406b63e13f8ef385caa76eeeef76d3499025175361d0868ab5e21be3e5478e03deb380e5fc02b4bb6c88ada521648b091135b3f6329a64e49ca5699ca5b8fd326f10dac377b1a112e1be2e3fb5c1fe7960095d27e65efc6df2d8383b17fd
với iv = 72abca4ba196bd3562acf269f8578551
và ciphertext = c22ca2e6545abcec87fed18ba449944219e9556fae52ae7975567823e20cd451
Ta có thể tìm được flag
Flag: crypto{n07_3ph3m3r4l_3n0u6h}
Ở challnge này thay vì dùng DHKE trong nhóm nhân ,ALice và Bob triển khai trong nhóm cộng
Điều đó tương đương
mod
mod
mod
Từ đó ta có thể tính được a , a chính là ngịch đảo của A mod p
Flag: crypto{cycl1c_6r0up_und3r_4dd1710n?}
Như trong Static client 1, ta có thể sử dụng lại các giá trị của Alice và phát hiện ra rằng Bob đang sử dụng lại khóa 'b' của mình. Thử thách này được giải quyết bằng cách sửa đổi p vì g (dù sao cũng đang được máy chủ xác minh).Thay p bằng một số smooth với điều kiện:
Flag: crypto{uns4f3_pr1m3_sm4ll_oRd3r}
Challenge cho 2 file
script.py
và output.txt
Đọc source code ta thấy chương trình cho phép người dùng nhập sau đó random sao cho với để tính shared_secret
theo sau đó là quá trình giải mã. iv
và ciphertext
ta đã có vấn đề ở đây là chỉ cần biết được shared_secret
là sẽ tìm được flag.Phân tích kĩ hơn một chút ta sẽ thấy được điều bất thường :
Chức năng của 2 hàm này là để trả về mod và mod .Biểu thức nên dùng toán tử "**" hoặc hàm pow() vì trong python kí tự "^" tương đượng với phép XOR
điều đó có nghĩa là thuật toán bây giờ trở thành:
B = g ^ b mod p
Từ đây ta có thể tính ngược lại b khi biết B và g
b = B ^ g mod p
Sau đó tính được shared_secret
s = A ^ b mod p
Flag: crypto{b3_c4r3ful_w1th_y0ur_n0tati0n}
Challenge cho 2 file
the_matrix.sage
và flag.enc
Đọc source code ta thấy
mat.multiplicative_order() là phương thức được sử dụng trong thư viện SageMath để tính toán bậc đơn vị của ma trận trên trường hữu hạn GF(2). Bậc đơn vị của ma trận là số nguyên dương nhỏ nhất m sao cho ma trận mũ m (tức là m lần lấy tích của ma trận với chính nó) trở thành ma trận đơn vị. Nếu ma trận không có bậc đơn vị, phương thức này sẽ trả về giá trị None.
Sử dụng hàm generate_mat để tạo ma trận và mã hóa nó bằng cách sử dụng phép mũ modulo ^ và số mũ E, lưu kết quả vào file flag.enc(là một ma trận 50 hàng 50 cột).
Chúng ta có thể giải mã ma trận bằng cách tính lũy thừa nghịch đảo của E, sau đó lấy các bit của ma trận đầu tiên (34 * 8 / 50 + 1) và giải mã chúng.Việc lấy số lượng bit cụ thể là (34* 8/50) + 1 được tính toán dựa trên số lượng cột của ma trận đầu tiên. Vì ma trận có kích thước là 50 x 50 và mỗi cột của nó biểu diễn 50 bit của thông điệp, nên số lượng cột cần lấy sẽ là 34* 8/50, với (34*8) là số lượng bit của chuỗi hex mã hóa của thông điệp và 50 là số lượng bit được biểu diễn trong mỗi cột của ma trận.
Thêm một cột nữa được lấy ra bởi vì chuỗi hex mã hóa của thông điệp(FLAG) có độ dài là 34 byte (mỗi byte bao gồm 8 bit), và 34 * 8 bit này không thể được chia đều thành các cột 50-bit. Vì vậy, một cột nữa được lấy ra để đảm bảo rằng đủ bit để giải mã thông điệp được trích xuất từ ma trận đầu tiên.
Sage code:
Python code:
Flag: crypto{there_is_no_spoon_66eff188}