Ejemplo n.º 1
0
def solve_x(bars, bars_pos, s):
    #if len(s) == 4:
    if False:
        barsp = bars.prev()
        #print("a='{0}'".format(barsp[20:30]))
        if barsp[20:30] == ' ' * 10:
            print("bars={0} s={1}".format(str(), s))
        return
    bars.prev()
    bars_pos -= 1
    if bars_pos < 0:
        return
    for c in string.ascii_uppercase:
        new_bars = Bars(bars)
        new_bars_pos = bars_pos
        code = encode_morse(c)
        rcode = code[::-1]
        for i in rcode:
            new_bars_pos -= 1
            if new_bars < 0:
                break
            new_bars.xor(new_bars_pos, i)
        #print("{0} c={1}".format(str(new_bars), code))
        #print("bars={0} c={1}".format(str(new_bars), c))
        if new_bars_pos <= 0:
            print("bars={0} s={1}".format(str(new_bars), s))
        else:
            print("new_bars_pos={0} codelen={1}".format(
                new_bars_pos, len(code)))
            bp = str(new_bars)[new_bars_pos:new_bars_pos + len(code)]
            print("bars='{0}' bp='{1}' c={2}".format(str(new_bars), bp, c + s))
            if bp == ' ' * (len(code)):
                solve_x(new_bars, new_bars_pos, c + s)
Ejemplo n.º 2
0
def simple_check(answer):
    chk_str = "iTiIIT"
    bars = Bars(" "*32)
    bars_pos = 0
    count = 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()
    #print("answer={0} bars={1} bars_str={2}".format(''.join(answer), str(bars), str(bars)[len(bars)-len(answer):]))
    return chk_str[0:len(answer)] == str(bars)[len(bars)-len(answer):]
Ejemplo n.º 3
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.º 4
0
def solve():
    orig = ' iT iTiI T TTiTIITITIITTi iTiIIT'
    bars = Bars(orig)
    bars_pos = len(orig) - 7
    solve_x(bars, bars_pos, "")
    if False:
        bars.prev()
        print(str(bars))
        for c in string.ascii_uppercase:
            new_bars = Bars(bars)
            bars_pos = len(orig) - 7
            code = encode_morse(c)
            rcode = code[::-1]
            for i in rcode:
                new_bars.xor(bars_pos, i)
                bars_pos -= 1
                bars_pos %= len(bars)
            print("new_bars={0} xor={1}".format(str(new_bars), code))
            print("prv_bars={0}".format(str(new_bars.prev())))
Ejemplo n.º 5
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.º 7
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.º 8
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))