class SignatureParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.verifing = 0 self.e = 65537 self.n = 47775743999999999999 # TODO: this bit length is too short for RSA! def handle_starttag(self, tag, attrs): attrs_dict = dict(attrs) if self.verifing > 0: self.verifing += 1 elif "data-sign" in attrs_dict: print("data-sign: " + attrs_dict["data-sign"]) self.verifing = 1 self.signature = int(attrs_dict["data-sign"]) self.bars = Bars(" " * 32) self.bars_pos = 0 def handle_data(self, data): if self.verifing > 0: for c in data: c = c.upper() assert (ord(' ') < ord(c) and ord(c) < 127) code = encode_morse(c) print('code=' + code) for i in code: self.bars.xor(self.bars_pos, i) self.bars_pos += 1 self.bars_pos %= len(self.bars) self.bars_pos += 1 self.bars_pos %= len(self.bars) print(self.bars) self.bars.next() print(self.bars) def handle_endtag(self, tag): if self.verifing > 0: self.verifing -= 1 if self.verifing == 0: hash_value = self.bars.num() if verify_RSA_signature(hash_value, self.e, self.n, self.signature): print("verification succeeded!") else: print("verification failed")
def check_answer(answer): bars = Bars(" "*32) bars_pos = 0 for c in answer: c = c.upper() assert(ord(' ') < ord(c) and ord(c) < 127) code = encode_morse(c) for i in code: bars.xor(bars_pos, i) bars_pos += 1; bars_pos %= len(bars) bars_pos += 1; bars_pos %= len(bars) bars.next() hash_value = bars.num() if True: s = bars_num_to_str(hash_value) ans = "iT iTiI T" if 0 <= s.find(ans): print('anser='.join(answer)) return hash_value == 1758412232636122750
class SignatureParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.verifing = 0 self.e = 65537 self.n = 47775743999999999999 # TODO: this bit length is too short for RSA! def handle_starttag(self, tag, attrs): attrs_dict = dict(attrs) if self.verifing > 0: self.verifing += 1 elif "data-sign" in attrs_dict: print("data-sign: " + attrs_dict["data-sign"]) self.verifing = 1 self.signature = int(attrs_dict["data-sign"]) self.bars = Bars(" "*32) self.bars_pos = 0 def handle_data(self, data): if self.verifing > 0: for c in data: c = c.upper() assert(ord(' ') < ord(c) and ord(c) < 127) code = encode_morse(c) for i in code: self.bars.xor(self.bars_pos, i) self.bars_pos += 1; self.bars_pos %= len(self.bars) self.bars_pos += 1; self.bars_pos %= len(self.bars) print(self.bars) self.bars.next() print(self.bars) def handle_endtag(self, tag): if self.verifing > 0: self.verifing -= 1 if self.verifing == 0: hash_value = self.bars.num() if verify_RSA_signature(hash_value, self.e, self.n, self.signature): print("verification succeeded!") else: print("verification failed")
def solve3(): e = 65537 n = 47775743999999999999 # TODO: this bit length is too short for RSA! h = 1758412232636122750 signature = 26984024434151540355 bars = Bars(" "*32) bars_pos = 0 data = "EBMDKA" for c in data: c = c.upper() print("c=" + c) assert(ord(' ') < ord(c) and ord(c) < 127) code = encode_morse(c) for i in code: bars.xor(bars_pos, i) bars_pos += 1; bars_pos %= len(bars) bars_pos += 1; bars_pos %= len(bars) print(bars) bars.next() print(bars) hash_value = bars.num() return lets_take_tea_break(hash_value, e, n, signature)
def solve2(): h = 1758412232636122750 s = bars_num_to_str(h) print("bars.str:" + s) barsd = Bars(s) bars = Bars(' ' + str(barsd)) print("bars.num:" + str(bars.num())) bars_len = len(bars) print("bars.len=" + str(bars_len)) bars_pos = bars_len - 1 answer = [] while 0 <= bars_pos: found = False for c in string.ascii_uppercase: tmp_bars = Bars(bars) tmp_bars.prev() tmp_pos = bars_pos code = encode_morse(c) rcode = reverse_str(code) ok = 0 for i in rcode: tmp_bars.xor(tmp_pos, i) if tmp_bars[tmp_pos] != ' ': ok += 1 tmp_pos -= 1; tmp_pos %= bars_len if len(code) - 1 <= ok: found = True bars.prev() #print("c=" + c) answer.append(c) for i in rcode: bars.xor(bars_pos, i) bars_pos -= 1; bars_pos %= bars_len break if found == False: print("failed") break print("bars=" + str(bars))