Ejemplo n.º 1
0
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")
Ejemplo n.º 2
0
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")
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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))