Zadanie3 #28
160
Zadanie3
Normal file
160
Zadanie3
Normal file
@ -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()
|
Loading…
Reference in New Issue
Block a user