Beispiel #1
0
def test_diopcoverage():
    eq = (2 * x + y + 1)**2
    assert diop_solve(eq) == {(t_0, -2 * t_0 - 1)}
    eq = 2 * x**2 + 6 * x * y + 12 * x + 4 * y**2 + 18 * y + 18
    assert diop_solve(eq) == {(t, -t - 3), (2 * t - 3, -t)}
    assert diop_quadratic(x + y**2 - 3) == {(-t**2 + 3, -t)}

    assert diop_linear(x + y - 3) == (t_0, 3 - t_0)

    assert base_solution_linear(0, 1, 2, t=None) == (0, 0)
    ans = (3 * t - 1, -2 * t + 1)
    assert base_solution_linear(4, 8, 12, t) == ans
    assert base_solution_linear(4, 8, 12,
                                t=None) == tuple(_.subs(t, 0) for _ in ans)

    assert cornacchia(1, 1, 20) is None
    assert cornacchia(1, 1, 5) == {(2, 1)}
    assert cornacchia(1, 2, 17) == {(3, 2)}

    raises(ValueError, lambda: reconstruct(4, 20, 1))

    assert gaussian_reduce(4, 1, 3) == (1, 1)
    eq = -w**2 - x**2 - y**2 + z**2

    assert diop_general_pythagorean(eq) == \
        diop_general_pythagorean(-eq) == \
            (m1**2 + m2**2 - m3**2, 2*m1*m3,
            2*m2*m3, m1**2 + m2**2 + m3**2)

    assert len(check_param(S(3) + x / 3, S(4) + x / 2, S(2), [x])) == 0
    assert len(check_param(Rational(3, 2), S(4) + x, S(2), [x])) == 0
    assert len(check_param(S(4) + x, Rational(3, 2), S(2), [x])) == 0

    assert _nint_or_floor(16, 10) == 2
    assert _odd(1) == (not _even(1)) == True
    assert _odd(0) == (not _even(0)) == False
    assert _remove_gcd(2, 4, 6) == (1, 2, 3)
    raises(TypeError, lambda: _remove_gcd((2, 4, 6)))
    assert sqf_normal(2*3**2*5, 2*5*11, 2*7**2*11)  == \
        (11, 1, 5)

    # it's ok if these pass some day when the solvers are implemented
    raises(NotImplementedError,
           lambda: diophantine(x**2 + y**2 + x * y + 2 * y * z - 12))
    raises(NotImplementedError, lambda: diophantine(x**3 + y**2))
    assert diop_quadratic(x**2 + y**2 - 1**2 - 3**4) == \
           {(-9, -1), (-9, 1), (-1, -9), (-1, 9), (1, -9), (1, 9), (9, -1), (9, 1)}
Beispiel #2
0
def get_next_offset_and_period(cur_offset, cur_period, req_offset, req_period):
    # cur_offset + k*cur_period = req_offset + n*req_period
    print("\nsolving for added", req_offset, req_period)
    sol_k, sol_n = base_solution_linear(req_offset - cur_offset, cur_period,
                                        -1 * req_period, t)
    print("k=", sol_k, "n=", sol_n)
    print("finding new offset for", req_offset, req_period)
    # finding minimal integer t which satisfies a*t + b >= 0
    b, at = sol_k.args
    if at.args:
        a, _ = at.args
        print("a, b", a, b)
        min_t = int(math.ceil(-1 * b / a))
    else:
        min_t = 0
    print("min_t", min_t)
    k = int(round(sol_k.evalf(subs={t: min_t})))
    print("calculating new period", req_offset, req_period)
    return cur_offset + k * cur_period, lcm(cur_period, req_period)
Beispiel #3
0
def main():
    e1 = 65537
    e2 = 343223
    sol = base_solution_linear(1, e1, -e2)
    # x = sol[0] # 133132
    # y = sol[1] # -25421
    x = 133132
    y = -25421

    # print(x, y)

    c1_b64 = 'RBVdQw7Pllwb42GDYyRa6ByVOfzRrZHmxBkUPD393zxOcrNRZgfub1mqcrAgX4PAsvAOWptJSHbrHctFm6rJLzhBi/rAsKGboWqPAWYIu49Rt7Sc/5+LE2dvy5zriAKclchv9d+uUJ4/kU/vcpg2qlfTnyor6naBsZQvRze0VCMkPvqWPuE6iL6YEAjZmLWmb+bqO+unTLF4YtM1MkKTtiOEy+Bbd4LxlXIO1KSFVOoGjyLW2pVIgKzotB1/9BwJMKJV14/+MUEiP40ehH0U2zr8BeueeXp6NIZwS/9svmvmVi06Np74EbL+aeB4meaXH22fJU0eyL2FppeyvbVaYQ=='
    c2_b64 = 'TSHSOfFBkK/sSE4vWxy00EAnZXrIsBI/Y6mGv466baOsST+qyYXHdPsI33Kr6ovucDjgDw/VvQtsAuGhthLbLVdldt9OWDhK5lbM6e0CuhKSoJntnvCz7GtZvjgPM7JDHQkAU7Pcyall9UEqL+W6ZCkiSQnK+j6QB7ynwCsW1wAmnCM68fY2HaBvd8RP2+rPgWv9grcEBkXf7ewA+sxSw7hahMaW0LYhsMYUggrcKqhofGgl+4UR5pdSiFg4YKUSgdSw1Ic/tug9vfHuLSiiuhrtP38yVzazqOZPXGxG4tQ6btc1helH0cLfw1SCdua1ejyan9l1GLXsAyGOKSFdKw=='

    c1_hex = base64.b64decode(c1_b64).hex()
    c2_hex = base64.b64decode(c2_b64).hex()
    # print("c1 hex is: ")
    # print(c1_hex)
    # print("c2 hex is: ")
    # print(c2_hex)

    c1_int = int(c1_hex, 16)
    c2_int = int(c2_hex, 16)
    # print("c1 int is: ")
    # print(c1_int)
    # print("c2 int is: ")
    # print(c2_int)

    # the modulo
    n = 'c6acb8df486e6671d4a5564803e1c3214a8e274de0ac0043ec28c8589f377c7e8d308bc3e302850384344ba7988885620a418e6ad955578284fc04f289f126b38a01816251cef9a14fd4c249d96b69087fa91b2e1adbdc80cb96ff0ccb6129d8f6737da850c451f2ed3f6cb61c36891dc924d0ab28f26adf0ed357ce848d02ffe00912714ccf6372c1f41080e86747a0303eb5cdf6ce912f1144fd4f55743c796875a14fdff8f8b662150c56be58b09239771dc44d969079c4ad8fd993bc630b7855d2e02e8be16824dcd5ab3813231c1731110a8bd028d7a1dfab892e75294557bafc71aeaf5e48db0267a6db63d350f995068ee1cad6d32df11a49bd24ba97'
    # note: .hex() only converts int to hex, not bytes
    n = int(n, 16)
    # print(e1 * x + e2 * y) # double checking

    message = (pow(c1_int, x, n) * pow(gmpy2.invert(c2_int, n), -y, n)) % n
    print(message)

    s = hex(message)[2:]
    b = bytes.fromhex(s)
    print(b.decode("ascii"))
Beispiel #4
0
def main():

    ### Solutions: Encoding
    print('--- ENCODING ---')
    # 1
    a = [
        99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49,
        110, 116, 52, 98, 108, 51, 125
    ]
    sol_1 = "".join([chr(i) for i in a])
    print(sol_1)

    # 2
    b = '63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d'
    print(bytes.fromhex(b).decode('ascii'))

    # 3
    c = '72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf'
    print(base64.b64encode(bytes.fromhex(c)).decode('ascii'))

    # 4
    d = 11515195063862318899931685488813747395775516287289682636499965282714637259206269
    print(long_to_bytes(d).decode('ascii'))

    # encoding_challenge()

    ### Solutions: XOR
    print('--- XOR ---')
    # 1
    a = "label"
    b = 13
    c = ""
    for i in a:
        c += chr(b ^ ord(i))
    print("crypto{" + c + "}")

    #2
    KEY1 = 0xa6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
    KEY2KEY1 = 0x37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
    KEY2KEY3 = 0xc1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
    FLAGKEY1KEY3KEY2 = 0x04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
    res = FLAGKEY1KEY3KEY2 ^ KEY2KEY3 ^ KEY1
    print(dec(res))

    #3
    a = hex(
        0x73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d)
    for i in range(128):
        current = ''
        for j in range(2, len(a), 2):
            current += chr(int(a[j:j + 2], 16) ^ i)
        if current.find("crypto") != -1:
            print(current)
            break

    #4
    a = '0' + hex(
        0x0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104
    )[2:]
    start = "crypto{1"
    keys = []
    for i in range(len(start)):
        # print(a[2*i:2*i + 2], start[i])
        keys.append(ord(start[i]) ^ int(a[2 * i:2 * i + 2], 16))
    ret = ""
    # print(keys)
    for i in range(0, len(a), 2):
        ret += chr(keys[(i // 2) % len(keys)] ^ int(a[i:i + 2], 16))
    print(ret)

    #5
    lemur_xor()

    print('--- MATH ---')
    # Math
    # 1
    a = 66528
    b = 52920
    print(gmpy2.gcd(a, b))

    # 2
    p = 26513
    q = 32321
    res = base_solution_linear(1, p, q)
    # x, y = symbols("x, y")
    # print(diophantine(p*x + q*y - 1))
    print("crypto{" + str(res[0]) + "," + str(res[1]) + "}")

    # 3
    print(8146798528947 % 17)

    # 4
    print(pow(273246787654, 65536, 65537))

    # 5
    print(gmpy2.invert(3, 13))

    # Data Formats
    print('--- DATA FORMATS ---')
    # https://www.cryptologie.net/article/260/asn1-vs-der-vs-pem-vs-x509-vs-pkcs7-vs/
    # private key:
    # 	-----BEGIN RSA PRIVATE KEY-----
    # MIIEowIBAAKCAQEAzvKDt+EO+A6oE1LItSunkWJ8vN6Tgcu8Ck077joGDfG2NtxD
    # 4vyQxGTQngr6jEKJuVz2MIwDcdXtFLIF+ISX9HfALQ3yiedNS80n/TR1BNcJSlzI
    # uqLmFxddmjmfUvHFuFLvxgXRga3mg3r7olTW+1fxOS0ZVeDJqFCaORRvoAYOgLgu
    # d2/E0aaaJi9cN7CjmdJ7Q3m6ryGuCwqEvZ1KgVWWa7fKcFopnl/fcsSecwbDV5hW
    # fmvxiAUJy1mNSPwkf5YhGQ+83g9N588RpLLMXmgt6KimtiWnJsqtDPRlY4Bjxdpu
    # V3QyUdo2ymqnquZnE/vlU/hn6/s8+ctdTqfSCwIDAQABAoIBAHw7HVNPKZtDwSYI
    # djA8CpW+F7+Rpd8vHKzafHWgI25PgeEhDSfAEm+zTYDyekGk1+SMp8Ww54h4sZ/Q
    # 1sC/aDD7ikQBsW2TitVMTQs1aGIFbLBVTrKrg5CtGCWzHa+/L8BdGU84wvIkINMh
    # CtoCMCQmQMrgBeuFy8jcyhgl6nSW2bFwxcv+NU/hmmMQK4LzjV18JRc1IIuDpUJA
    # kn+JmEjBal/nDOlQ2v97+fS3G1mBAaUgSM0wwWy5lDMLEFktLJXU0OV59Sh/90qI
    # Jo0DiWmMj3ua6BPzkkaJPQJmHPCNnLzsn3Is920OlvHhdzfins6GdnZ8tuHfDb0t
    # cx7YSLECgYEA7ftHFeupO8TCy+cSyAgQJ8yGqNKNLHjJcg5t5vaAMeDjT/pe7w/R
    # 0IWuScCoADiL9+6YqUp34RgeYDkks7O7nc6XuABi8oMMjxGYPfrdVfH5zlNimS4U
    # wl93bvfazutxnhz58vYvS6bQA95NQn7rWk2YFWRPzhJVkxvfK6N/x6cCgYEA3p21
    # w10lYvHNNiI0KBjHvroDMyB+39vD8mSObRQQuJFJdKWuMq+o5OrkC0KtpYZ+Gw4z
    # L9DQosip3hrb7b2B+bq0yP7Izj5mAVXizQTGkluT/YivvgXcxVKoNuNTqTEgmyOh
    # Pn6w+PqRnESsSFzjfWrahTCrVomcZmnUTFh0rv0CgYBETN68+tKqNbFWhe4M/Mtu
    # MLPhFfSwc8YU9vEx3UMzjYCPvqKqZ9bmyscXobRVw+Tf9llYFOhM8Pge06el74qE
    # IvvGMk4zncrn8LvJ5grKFNWGEsZ0ghYxJucHMRlaU5ZbM6PEyEUQqEKBKbbww65W
    # T3i7gvuof/iRbOljA9yzdwKBgQDT9Pc+Fu7k4XNRCon8b3OnnjYztMn4XKeZn7KY
    # GtW81eBJpwJQEj5OD3OnYQoyovZozkFgUoKDq2lJJuul1ZzuaJ1/Dk+lR3YZ6Wtz
    # ZwumCHnEmSMzWyOT4Rp2gEWEv1jbPbZl6XyY4wJG9n/OulqDbHy4+dj5ITb/r93J
    # /yLCBQKBgHa8XYMLzH63Ieh69VZF/7jO3d3lZ4LlMEYT0BF7synfe9q6x7s0ia9b
    # f6/QCkmOxPC868qhOMgSS48L+TMKmQNQSm9b9oy2ILlLA0KDsX5O/Foyiz1scwr7
    # nh6tZ+tVQCRvFviIEGkaXdEiBN4eTbcjfc5md/u9eA5N21Pzgd/G
    # -----END RSA PRIVATE KEY-----

    # d = '7C:3B:1D:53:4F:29:9B:43:C1:26:08:76:30:3C:0A:95:BE:17:BF:91:A5:DF:2F:1C:AC:DA:7C:75:A0:23:6E:4F:81:E1:21:0D:27:C0:12:6F:B3:4D:80:F2:7A:41:A4:D7:E4:8C:A7:C5:B0:E7:88:78:B1:9F:D0:D6:C0:BF:68:30:FB:8A:44:01:B1:6D:93:8A:D5:4C:4D:0B:35:68:62:05:6C:B0:55:4E:B2:AB:83:90:AD:18:25:B3:1D:AF:BF:2F:C0:5D:19:4F:38:C2:F2:24:20:D3:21:0A:DA:02:30:24:26:40:CA:E0:05:EB:85:CB:C8:DC:CA:18:25:EA:74:96:D9:B1:70:C5:CB:FE:35:4F:E1:9A:63:10:2B:82:F3:8D:5D:7C:25:17:35:20:8B:83:A5:42:40:92:7F:89:98:48:C1:6A:5F:E7:0C:E9:50:DA:FF:7B:F9:F4:B7:1B:59:81:01:A5:20:48:CD:30:C1:6C:B9:94:33:0B:10:59:2D:2C:95:D4:D0:E5:79:F5:28:7F:F7:4A:88:26:8D:03:89:69:8C:8F:7B:9A:E8:13:F3:92:46:89:3D:02:66:1C:F0:8D:9C:BC:EC:9F:72:2C:F7:6D:0E:96:F1:E1:77:37:E2:9E:CE:86:76:76:7C:B6:E1:DF:0D:BD:2D:73:1E:D8:48:B1'
    # d = int(d.replace(":", "").lower(),16)
    # print(d)

    # 1
    f = open(
        '/Users/Kvothe/Downloads/privacy_enhanced_mail_1f696c053d76a78c2c531bb013a92d4a.pem',
        'r')
    key = RSA.importKey(f.read())
    print(key.d)

    # 2
    f = open(
        '/Users/Kvothe/Downloads/2048b-rsa-example-cert_3220bd92e30015fe4fbeb84a755e7ca5.der',
        'rb')
    cert = Certificate.load(f.read())

    n = cert.public_key.native["public_key"]["modulus"]

    print(n)

    # 3
    # from openssh -> openssl, the command is:
    # ssh-keygen -f ~/Downloads/bruce_rsa_6e7ecd53b443a97013397b1a1ea30e14.pub -e -m pem
    pub_key = '''
	-----BEGIN RSA PUBLIC KEY-----
MIIBigKCAYEArTy6m2vhhbwx3RVbNVb3ZOenCqqsOXHaJpbtN+OuulLKBSKpIoPB
+ZDbDXn0qWkf4lOxtGSgolkUbgG07Lhzfgs+dul4UL84CkwZExmF3Rf1nRv+v7pq
Lt2dPsCb02YLxJnhHJb4rQaz2ZM4QCtTOcqYDUeKfLHCaZU4Ekm/OApKrpfw4/0o
fn8KOrFN0t4/dqnNuwVRgoaUIhsI47reApB2rs0AP4CggSIi8s6BXCxB4YzgThBK
5760T1giACYQC5MFdq1Gw+INSFmu0CNqt5wdJ5Z4z5448Gke06R+IMtjUiGDQ3Qt
T2fK3gWhZxk14M4UNrdETgTW/mQ4B/BcvikxvoBGpKbttG0agfOjTen6wyzpGfcd
8N9rSbaqqyUwC8uDotzFtFzzutVAU9d91TagGzWBhNoMfplwVTns27GOOgv1dn5s
QSSSmP0hTbPMDlThysKkR9BiOVbBtWGQpV936pPBgyWERGqMqC9xykLdVHv2Vu05
T0WMwKCAetgtAgMBAAE=
-----END RSA PUBLIC KEY-----
	'''
    f = open('/Users/exodia/Downloads/temp.pub', 'rb')
    key = RSA.importKey(f.read())
    print(key.n)