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()