156 lines
3.3 KiB
Plaintext
156 lines
3.3 KiB
Plaintext
from sys import argv
|
|
|
|
def toBinary(string):
|
|
return "".join([format(ord(char),'#010b')[2:] for char in string])
|
|
|
|
def binnahex(var):
|
|
all = {"0000": "0",
|
|
"0001": "1",
|
|
"0010": "2",
|
|
"0011": "3",
|
|
"0100": "4",
|
|
"0101": "5",
|
|
"0110": "6",
|
|
"0111": "7",
|
|
"1000": "8",
|
|
"1001": "9",
|
|
"1010": "A",
|
|
"1011": "B",
|
|
"1100": "C",
|
|
"1101": "D",
|
|
"1110": "E",
|
|
"1111": "F"
|
|
}
|
|
i = 0
|
|
output = ""
|
|
|
|
while (len(var) % 4 != 0):
|
|
var = "0" + var
|
|
|
|
while (i < len(var)):
|
|
output = output + all[var[i:i + 4]]
|
|
i = i + 4
|
|
|
|
output = output.lstrip("0")
|
|
output = "0" if len(output) == 0 else output
|
|
|
|
return output
|
|
|
|
def toString(binaryString):
|
|
return "".join([chr(int(binaryString[i:i+8],2)) for i in range(0,len(binaryString),8)])
|
|
|
|
#XOR
|
|
def xor(a, b):
|
|
|
|
# init
|
|
result = []
|
|
|
|
# porownuje znaki
|
|
for i in range(1, len(b)):
|
|
if a[i] == b[i]:
|
|
result.append('0')
|
|
else:
|
|
result.append('1')
|
|
|
|
return ''.join(result)
|
|
|
|
|
|
# dzielenie modulo 2
|
|
def divide(message, poly16):
|
|
|
|
# Ilosc bitow dla operacji XOR 'na raz'
|
|
step = len(poly16)
|
|
|
|
# podzial krok po kroku
|
|
temp = message[0 : step]
|
|
|
|
while step < len(message):
|
|
|
|
if temp[0] == '1':
|
|
|
|
temp = xor(poly16, temp) + message[step]
|
|
|
|
else:
|
|
# jezeli 1 bit po lewej == 0
|
|
temp = xor('0'*step, temp) + message[step]
|
|
|
|
# kolejny krok
|
|
step += 1
|
|
|
|
if temp[0] == '1':
|
|
temp = xor(poly16, temp)
|
|
else:
|
|
temp = xor('0'*step, temp)
|
|
|
|
check = temp
|
|
return check
|
|
|
|
|
|
def decode(message_final,poly16,crc):
|
|
l_poly16 = len(poly16)
|
|
appended_message2 = toBinary(message_final)
|
|
obroc = list(appended_message2)
|
|
for i in range(l_poly16 - 1):
|
|
if obroc[i] == "0":
|
|
obroc[i] = "1"
|
|
elif obroc[i] == '1':
|
|
obroc[i] = "0"
|
|
|
|
appended_message2 = "".join(obroc)
|
|
|
|
dec = int(crc, 16)
|
|
crc2=bin(dec)[2:]
|
|
msg=appended_message2+crc2
|
|
remainder = divide(msg, poly16)
|
|
#Poprawione sprawdzanie
|
|
suma = 0
|
|
for i in range(0, len(remainder)):
|
|
if '1' in remainder:
|
|
suma = suma+1
|
|
|
|
if suma == 0:
|
|
print("true ")
|
|
elif suma > 0:
|
|
print("false")
|
|
|
|
|
|
|
|
def encode(message, poly16):
|
|
#konwersja z ascii do binarnego
|
|
aa=toBinary(message)
|
|
a=toString(aa)
|
|
l_poly16 = len(poly16)
|
|
|
|
obroc = list(aa)
|
|
for i in range(l_poly16 - 1):
|
|
if obroc[i] == "0":
|
|
obroc[i] = "1"
|
|
elif obroc[i] == '1':
|
|
obroc[i] = "0"
|
|
|
|
aa = "".join(obroc)
|
|
|
|
# Dodajemy n-1 "0" do wiadomosci
|
|
appended_message = aa + '0'*(l_poly16-1)
|
|
remainder = divide(appended_message, poly16)
|
|
ab=binnahex(remainder)
|
|
message_final = a + ab
|
|
print("calosc : ", message_final)
|
|
print("crc : ", ab)
|
|
|
|
|
|
|
|
poly16 = "10001000000100001"
|
|
|
|
def main():
|
|
global message
|
|
message = list(argv[1])
|
|
flag = argv[2]
|
|
if flag == 'encode':
|
|
encode(message, poly16)
|
|
elif flag == 'decode':
|
|
crc = argv[3]
|
|
decode(message, poly16,crc)
|
|
if __name__ == '__main__':
|
|
main()
|