diff --git a/Zadanie3 b/Zadanie3 new file mode 100644 index 0000000..ff3ee5b --- /dev/null +++ b/Zadanie3 @@ -0,0 +1,160 @@ +from sys import argv +import sys +import binascii +import base64 + +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 + +#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 = "10001000000100001" + # 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,crc): + poly16 = "10001000000100001" + l_poly16 = len(poly16) + message = bytearray(message, 'ascii') + message = format(int.from_bytes(message, "big"), "b") + while len(message) % 8 != 0: + message = "0" + message + dec = int(crc, 16) + crc2=bin(dec)[2:] + while len(crc2) % 8 != 0: + crc2 = "0" + crc2 + msg=message+crc2 + while len(msg) % 8 != 0: + msg = "0" + msg + obroc = list(msg) + for i in range(l_poly16 - 1): + if obroc[i] == "0": + obroc[i] = "1" + elif obroc[i] == '1': + obroc[i] = "0" + + msg = "".join(obroc) + + remainder = divide(msg) + + 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 = "10001000000100001" + a=message + + message = bytearray(message, 'ascii') + message = format(int.from_bytes(message, "big"), "b") + l_poly16 = len(poly16) + message = message + '0'*(l_poly16-1) + while len(message) % 8 != 0: + message = "0" + message + obroc = list(message) + for i in range(l_poly16 - 1): + if obroc[i] == "0": + obroc[i] = "1" + elif obroc[i] == '1': + obroc[i] = "0" + + message = "".join(obroc) + remainder = divide(message) + ab=binnahex(remainder) + d=str(base64.b16decode(ab))[2:-1] + message_final = a + d + message_final = bytearray(message_final, 'ascii') + d = bytearray(d, 'ascii') + print("calosc : ", message_final) + print("crc hex : ", ab) + print("crc ascii : ", d) + decode(a,ab) + +def main(): + global message + message = list(argv[1]) + flag = argv[2] + if flag == 'encode': + encode(sys.argv[1]) + elif flag == 'decode': + crc = argv[3] + decode(sys.argv[1],sys.argv[3]) +if __name__ == '__main__': + main()