1つの #は/ usr / binに/ ENVパイソン! 2 #- * -コーディング:UTF-8 - * - 3 から hashlib インポートSHA256 4 デフXOR(B): 5 結果= [] 6 ための(i、j)の中のZIP(B): 7 result.append(CHR(ORD(I)^ ORD(J))) 8 リターン "" .join(結果) 9 デフHASH(MSG): 10 戻り SHA256(MSG).digest( )[8 ] 11 DEF zjctf_encrypt(gen_keys、HAHAHAH): 12 、I = 0 13 D1 = HAHAHAH [8 ] 14 、D2 = HAHAHAH [8 :] 15 用 I でgen_keys: 16 D1 = XOR(排他的論理和(HASH(D2)、I)、D1) 17 D1は、D2 = D2、D1 18 リターン D2 + D1 19 DEF (キー)gen_keymap: 20の マップ= [] 21 _ = キー 22 のための I における範囲(16 ): 23 _ = HASH(_) 24 maps.append(_) 25 リターンマップ 26 デフ暗号(鍵データ): 27の キー= gen_keymap(キー) 28 リターン zjctf_encrypt(キー、データ).encode(' 進' ) 29 の場合 __name__ == " __main__ " : 30 結果=暗号化(" zzzzzjctffffffff "、" This_is_the_flag " ) 31 プリント(結果) 32 #あなたの結果= 1b3a0152bef25769f384a740aa189e78
質問はXORを解決するためのヒントを使用することで行い、ダウンロードがPYファイルであることが判明しました。
まず、多分(暗号化に渡され、「zzzzzjctffffffff」、「This_is_the_flag」パラメータ)で
「zzzzzjctffffffff」にgen_keymap()HASHプロセスはマップを返し行います
zjctf_encrypt()このスライスをマッピングとXORさd2 + d1及び出力を返す "This_is_the_flag"
次のように復号化コードは次のようになります。
1 から hashlib インポートSHA256 2 デフ:XOR(B) 3 結果= [] 4 のための(i、j)の中のジップ(B): 5 result.append(CHR(ORD(I)^ ORD(J) )) 6 リターン "" .join(結果) 7 デフHASH(MSG): 8 リターン SHA256(MSG).digest()[8 ] 9 DEF zjctf_encrypt(gen_keys、HAHAHAH): 10 、I = 0 11 D1 = HAHAHAH [ :8 ] 12 、D2 = HAHAHAH [8 :] 13 D1、D2 = D2、D1 14 用 I でgen_keys: 15 D2 = XOR(排他的論理和(HASH(D1)、D2)、I) 16 D1、D2 = D2、D1 17 戻り D1 + D2 18は、 DEF (キー)gen_keymap。 19の マップ= [] 20 _ = キー 21 のための私にはxrange(16 ): 22 _ = HASH(_) 23 maps.append(_) 24 maps.reverse() 25 リターンマップ 26 DEF (キーデータ)を暗号化: 27の キー= gen_keymap(キー) 28 リターンzjctf_encrypt(キー、データ) 29 30キー= " zzzzzjctffffffff " 31結果は= ' 1b3a0152bef25769f384a740aa189e78 ' 32結果= result.decode(' 進' ) 33 印刷暗号化(キー、結果)
この問題は、文法のpythonの勉強だけではなく、また、暗号化アルゴリズムを理解し、hashlibライブラリの使用を検討しました。