예제 #1
0
def generateKeys(security_level = 1):
    prime_size, random_size = 0, 0

    if security_level == 1: prime_size, random_size = 160, 864

    elif security_level == 2: prime_size, random_size = 224, 1824

    elif security_level == 3: prime_size, random_size = 256, 2816

    else: return

    q = number.getPrime(prime_size)
    k = number.getRandomInteger(random_size)
    p = k * q + 1

    while utils.rm_primality(p) != True:
        k = utils.gen_random(random_size)
        p = k * q + 1

    a = number.getRandomRange(0, p)
    g = utils.mod_exp(a, (p - 1) / q, p)

    while g == 1:
        a = number.getRandomRange(0, p)
        g = utils.mod_exp(a, (p - 1) / q, p)

    x = number.getRandomRange(1, q - 2)
    y = utils.mod_exp(g, x, p)

    return p, q, g, x, y
예제 #2
0
def verifySignature(p, q, g, y, r, s, message):
    if r <= 0 or r >= q or s <= 0 or s >= q:
        print "Rejected!"
        return

    H = int(hexlify(CryptoBox.generateHash(message, 1)), 16)
    w = utils.inverse(s, q)
    u1 = (H * w) % q
    u2 = (r * w) % q
    v = ((utils.mod_exp(g, u1, p) * utils.mod_exp(y, u2, p)) % p) % q

    return True if v == r else False
예제 #3
0
def verifySignature(p, q, g, y, r, s, message):
    if r <= 0 or r >= q or s <= 0 or s >= q:
        print "Rejected!"
        return

    H = int(hexlify(CryptoBox.generateHash(message, 1)), 16)
    w = utils.inverse(s, q)
    u1 = (H * w) % q
    u2 = (r * w) % q
    v = ((utils.mod_exp(g, u1, p) * utils.mod_exp(y, u2, p)) % p) % q

    return True if v == r else False
예제 #4
0
def generateSignature(p, q, g, x, message):
    H = int(hexlify(CryptoBox.generateHash(message, 1)), 16)
    k = number.getRandomRange(1, q)
    r = utils.mod_exp(g, k, p) % q
    k_inv = utils.inverse(k, q)
    s = (k_inv * (H + x * r)) % q

    if (r == 0 or s == 0):
        # since it is very unlikely to make a recursive call, function will terminate eventually
        return generateSignature(p, q, g, x, message)
    
    return r, s
예제 #5
0
def generateSignature(p, q, g, x, message):
    H = int(hexlify(CryptoBox.generateHash(message, 1)), 16)
    k = number.getRandomRange(1, q)
    r = utils.mod_exp(g, k, p) % q
    k_inv = utils.inverse(k, q)
    s = (k_inv * (H + x * r)) % q

    if (r == 0 or s == 0):
        # since it is very unlikely to make a recursive call, function will terminate eventually
        return generateSignature(p, q, g, x, message)

    return r, s
예제 #6
0
def RSAEP(N, e, m):
    if m < 0 or m > N - 1:
        print "Message representative out of range!"
        return -1

    return utils.mod_exp(m, e, N)
예제 #7
0
def RSAVP1(N, e, s):
    if s < 0 or s > N - 1:
        print "Signature representative out of range"
        return

    return utils.mod_exp(s, e, N)
예제 #8
0
def RSASP1(N, d, m):
    if m < 0 or m > N - 1:
        print "Message representative out of range"
        return

    return utils.mod_exp(m, d, N)
예제 #9
0
def RSADP(N, d, c):
    if c < 0 or c > N - 1:
        print "Ciphertext representative out of range"
        return

    return utils.mod_exp(c, d, N)
예제 #10
0
def RSAEP(N, e, m):
    if m < 0 or m > N - 1:
        print "Message representative out of range!"
        return -1

    return utils.mod_exp(m, e, N)
예제 #11
0
def RSAVP1(N, e, s):
    if s < 0 or s > N - 1:
        print "Signature representative out of range"
        return

    return utils.mod_exp(s, e, N)
예제 #12
0
def RSASP1(N, d, m):
    if m < 0 or m > N - 1:
        print "Message representative out of range"
        return

    return utils.mod_exp(m, d, N)
예제 #13
0
def RSADP(N, d, c):
    if c < 0 or c > N - 1:
        print "Ciphertext representative out of range"
        return

    return utils.mod_exp(c, d, N)
예제 #14
0
def decrypt(p, q, x, r, t):
    k = utils.inverse(utils.mod_exp(r, x, p), p)
    message = (t * k) % p

    return message
예제 #15
0
def encrypt(p, q, g, y, message):
    k = number.getRandomRange(1, p - 2)
    r = utils.mod_exp(g, k, p)
    t = (utils.mod_exp(y, k, p) * message) % p

    return r, t