This is an implementation of a custom hash function. It can be used for teaching e.g. in a ctf-challenge
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
sfl_2022_2023_hash/hash.py

69 lines
1.5 KiB

import math
flag = "what_the_flag??!"
comment = "#input_string must only contain ascii characters"
comment2 = "#is the length of input_string important?"
def hash(input_string):
sl = eval(comment2[8:11] + "(" + comment[1:7] + comment2[24:31] + ")")
#max 32 chars
if sl > 2**5:
input_string = input_string[:32]
sl = 64 - (2**4 + 16)
#Padding
if sl != 32:
l = 32 - sl
input_string = input_string + comment2[:l]
sl = len(input_string)
h665 = input_string[int(sl / 2) : sl]
sta = [] #How far should each char be shifted
for char in h665:
sta.append(ord(char))
h664 = input_string[:int((sl / 2))]
a = True
while a:
for i in range(int(sl / 2)):
h664 = (h664[:i] +
f2(h664[i], sta[i]) +
h664[i + 1:])
for y in range(int(sl)):
a = f3(input_string[i], y)
i = 0
input_string = ""
while i < sl / 2:
input_string += h664[i]
input_string += h665[i]
i = i+1
return input_string.replace(" ", "_")
def f2(v1, v2):
v3 = (ord(v1) + v2) %126
it = 0
while (v3 < 32 or v3 > 126):
v3 = (v3 + ord(v1) + v2 + it) % 126
it = it + 1
return chr(v3)
def f3(v2, v1):
v3 = (ord(v2) + v1) %126
for i in range(v1):
v3 = (v3 + ord(v2) + v1 + i) % 126
return v3 == -1
flag_hash = hash(flag)
print("{" ,flag_hash, "}")