
Diberikan kittycrypt.tar.gz yang isinya example_input.txt, example_output.txt, flag_output.txt dan main.go
-- example_input.txt
You fools! You will never get my catnip!!!!!!!
-- example output.txt
π±βπ»πΈπΏπΌπ±βππΊπΎπΏππ±βπ»π±βππΊπΏπΉπΏπ±βπ»π±βππ±π±βπ€πΉπΏπΊπ±βππΉππΏπΎπ±βππ±βππΉπΎπ±βππ±βπ€πΎπ±βπ»π±βππΏπ½π±βππΊπΎπ±βπ€ππ»π±βππΈππΌπ±βπ€ππ±βππΊπ±βπ€πΌπΏπΎπ±βπππΏπ½ππ±βππ±βππΉπΎπΉπ±βπ€π±βπ€π±βππΉππ±π±βπ€πΎπ±βππ±ππ½πΏπ»π±βππΉπ±βπ€π±π±βπ€π±βπ€π±βπππΎπ½πΏπ±βπ»π±βππππ±βππΏπ±βπ€π±βππΉπ±βπ€π±βπ€πΎπ±βππ±βπππ±βπ€π±πΏπ±βπ€π±βππΈπΎπΏπ±βπ€πΎπ±βπ»π±βππΏππ±βππΈπΎπππ±π±βππΈπ±βπ€π±βπππ±βππ±βππ±πππΎπΊπ±βππΊππ½πΏπΈπ±βππΈπ±βπ€πΎπππ±βππΊππΌππΌπ±βππΊπΏπΏπΏπΏπ±βππΏπΎπ±βππ±βππΊπΏπ½πΏπ±βππ±βπππΎππΏπΉπ±βπ»πΈπ±βπ€πΉπ±βππΊπΏπ±βπππ±π±βππΊππ±βπ€πΎπ±βππ±βππΉπ±βπ€πΈππ±βππ±βππΉπ±βπ€πΌπ±βπ€πΎπ±βππ±πππ±βπ€ππ±βππΊπΏπ±βπ€π±βπ€π½π±βππΈπ±βπ€ππ±βπ€π±βππ±βππΊπ±βπ€π½ππΏπ±βππΊπΏπ±βπ»ππΏπ±βππΊπΎπ±βπ€πΏπ±βππ±βππΈππ±βππ±βπ€π»π±βππΈπ±βπ€π±βπ»π±βπ€πΎπ±βππΉπΏπ»ππ±βππ±βππΉπΏπΏπΏπΏ
-- flag_output.txt
π±βπ»πΈππΌπ±βππΊπΎπΏπ±βπ€π±π±βππΊπΏπΉπΏππ±βππ±π±βπ€πΊππ½π±βππΉππΏπΎπΏπ±βππΉπΎπ±βππ±βπ€π±βπ»π±βπ»π±βππΎπ±βππ±βππΊπΎπ±βπ€π±βπ€πΊπ±βππΈππΌπ±βπ€ππ±βππΊπ±βπ€πΌππ½π±βπππΏπΎπ±βπ€π±βππ±βππΉπΎπΉπΏπ»π±βππΉππ±πΎπ±π±βππ±ππΌπΏππ±βππΉπ±βπ€πΈπΎπΎπ±βπππΎπΌπΏπΏπ±βππππ±βπππ»π±βππΉπ±βπ€ππ±βπ€π±βππ±βπππ±βπ€π±πΏππ±βππΈπΎππ±βπ€ππ±βπ»π±βπ€ππΉπ±βππΈπΎπΏππ±βππ±βππΈπ±βπ€π±βπ»ππ±βπ»π±βππ±ππΏπ±βπ€π±βππ±βππΊππΌπΏπΊπ±βππΈπ±βπ€πΏπ±βπ€πΉπ±βππΊππ»π±βπ€πΈπ±βππΊπΏπΏππΈπ±βππΎπΏππ±βππΊπΏπΎπΏπ±βπ€π±βπππΎππΏπ±βπ»π±βπ»πΈππΈπ±βππΊπΏπ±βππ±βπ€πΊπ±βππΊππππ±π±βππΉπ±βπ€πΈπππ±βππΉπ±βπ€πΌπ±βπ€π±βπ»π±βππ±ππ±π±βπ€πΉπ±βππΊπΏπ±βππΎπΉπ±βππΈπ±βπ€πππ±βππ±βππΊπ±βπ€π½π±βπ€π±βπ€π±βππΊπΏπ±βππΎπ±π±βππΊπΎπ±βπππ±βππ±βππΈππ±βπ»πΎπ½π±βππΈπ±βπ€π±βππ±βπ€ππ±βππΉπΏπΌπΎπ»π±βππΉπΏππ±βπ€π»
-- main.go
package main
import (
"crypto/rand"
"encoding/hex"
"encoding/json"
"fmt"
"math/big"
"os"
"strings"
)
var CharSet = map[rune]string{
'0': "π±", '1': "π", '2': "πΈ", '3': "πΉ",
'4': "πΊ", '5': "π»", '6': "πΌ", '7': "π½",
'8': "πΎ", '9': "πΏ", 'A': "π", 'B': "π±βπ€",
'C': "π±βπ", 'D': "π±βπ»", 'E': "π±βπ", 'F': "π±βπ",
}
func catify(input string, keys []int) string {
var keyedText string
var result string
for i, char := range input {
keyedText += string(rune(int(char) + keys[i]))
}
fmt.Printf("I2Keyed: %s\\n", keyedText)
hexEncoded := strings.ToUpper(hex.EncodeToString([]byte(keyedText)))
fmt.Printf("K2Hex: %s\\n", hexEncoded)
for _, rune := range hexEncoded {
result += CharSet[rune]
}
return result
}
func savePair(name, input, output string) {
inputFile, err := os.OpenFile(name+"_input.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
fmt.Println(err)
return
}
defer inputFile.Close()
outputFile, err := os.OpenFile(name+"_output.txt", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
fmt.Println(err)
return
}
defer outputFile.Close()
if _, err := inputFile.Write([]byte(input)); err != nil {
fmt.Println(err)
return
}
if _, err := outputFile.Write([]byte(output)); err != nil {
fmt.Println(err)
return
}
}
func getKeys(length int) []int {
var keys = []int{}
keyFileName := fmt.Sprintf("keys_%d.json", length)
file, err := os.Open(keyFileName)
if err != nil {
for i := 0; i < length; i++ {
num, _ := rand.Int(rand.Reader, big.NewInt(60000))
keys = append(keys, int(num.Int64()))
}
keyFile, err := os.OpenFile(keyFileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
fmt.Println(err)
return []int{}
}
defer keyFile.Close()
encoded, _ := json.Marshal(keys)
keyFile.Write(encoded)
return keys
}
json.NewDecoder(file).Decode(&keys)
return keys
}
func main() {
input := "You fools! You will never get my catnip!!!!!!!"
keys := getKeys(len(input))
encoded := catify(input, keys)
savePair("example", input, encoded)
}
Tapi karena saya skill issue, saya convert ke python dengan bantuan gpt.
#main.py
import os
import json
import random
import string
from binascii import hexlify
# Karakter emoji untuk mapping
CHAR_SET = {
'0': "π±", '1': "π", '2': "πΈ", '3': "πΉ",
'4': "πΊ", '5': "π»", '6': "πΌ", '7': "π½",
'8': "πΎ", '9': "πΏ", 'A': "π", 'B': "π±βπ€",
'C': "π±βπ", 'D': "π±βπ»", 'E': "π±βπ", 'F': "π±βπ"
}
def catify(input_text, keys):
# Tambahkan key ke setiap karakter input
keyed_text = ''.join(chr(ord(char) + keys[i]) for i, char in enumerate(input_text))
print(f"I2Keyed: {keyed_text}")
# Ubah menjadi representasi hex
hex_encoded = hexlify(keyed_text.encode()).decode().upper()
print(f"K2Hex: {hex_encoded}")
# Konversi hex menjadi emoji menggunakan CHAR_SET
result = ''.join(CHAR_SET[char] for char in hex_encoded)
return result
def save_pair(name, input_text, output_text):
# Simpan input ke file
with open(f"{name}_input.txt", "w") as input_file:
input_file.write(input_text)
# Simpan output ke file
with open(f"{name}_output.txt", "w") as output_file:
output_file.write(output_text)
def get_keys(length):
key_file_name = f"keys_{length}.json"
# Jika file key ada, baca isinya
if os.path.exists(key_file_name):
with open(key_file_name, "r") as file:
keys = json.load(file)
return keys
# Jika tidak ada, buat key baru
keys = [random.randint(0, 59999) for _ in range(length)]
# Simpan key ke file
with open(key_file_name, "w") as file:
json.dump(keys, file)
return keys
def main():
input_text = "You fools! You will never get my catnip!!!!!!!"
# Dapatkan kunci dengan panjang input
keys = get_keys(len(input_text))
# Encode input menjadi catified string
encoded = catify(input_text, keys)
# Simpan hasil encoding dan input ke file
save_pair("example", input_text, encoded)
if __name__ == "__main__":
main()
kita bisa bagi jadi tiga bagian, yakni catify, save_pair, dan get_keys
def get_keys(length):
key_file_name = f"keys_{length}.json"
# Jika file key ada, baca isinya
if os.path.exists(key_file_name):
with open(key_file_name, "r") as file:
keys = json.load(file)
return keys
# Jika tidak ada, buat key baru
keys = [random.randint(0, 59999) for _ in range(length)]
# Simpan key ke file
with open(key_file_name, "w") as file:
json.dump(keys, file)
return keys
Singkat saja, fungsi ini men-generate random key sesuai panjang pesan yang diterima dengan key ada di interval [0, 59999].
def catify(input_text, keys):
# Tambahkan key ke setiap karakter input
keyed_text = ''.join(chr(ord(char) + keys[i]) for i, char in enumerate(input_text))
print(f"I2Keyed: {keyed_text}")
# Ubah menjadi representasi hex
hex_encoded = hexlify(keyed_text.encode()).decode().upper()
print(f"K2Hex: {hex_encoded}")
# Konversi hex menjadi emoji menggunakan CHAR_SET
result = ''.join(CHAR_SET[char] for char in hex_encoded)
return result
Sementara, fungsi catify memetakan setiap character nya ke character lainnya sesuai key nya masing-masing, di encode ke hex, lalu setiap char hex nya di encode ke emoji.
def save_pair(name, input_text, output_text):
# Simpan input ke file
with open(f"{name}_input.txt", "w") as input_file:
input_file.write(input_text)
# Simpan output ke file
with open(f"{name}_output.txt", "w") as output_file:
output_file.write(output_text)
Jelas bahwa yang kita dapat dari save_pair adalah input_text nya dan output_text nya, namun kita cuma punya flag_output nya, nah dari probset dikasih tau kalau example_output dan flag_output menggunakan keys yang sama, jadi jelas len(flag_input) == len(text_input).