示例#1
0
文件: index.py 项目: tkbctf/tkbctf4
def init1():
    group = IntegerGroupQ()
    group.paramgen(bit)

    alpha = group.randomGen()
    key   = group.random()
    beta  = alpha ** key
    x     = [ odd_random(group) for _ in range(numbers['cards']) ]

    room = Room(request.environ.get('beaker.session'), False)

    try:
        room.get('win')
    except:
        room.set('win', 0)

    [room.set(n, v) for n, v in [('p', group.p), ('q', group.q), ('alpha', alpha), ('key', key), ('beta_i', beta), ('x', x)]]
    room.save()

    response.content_type = 'application/json'
    return json.dumps(map(toStr, {
        'p'     : group.p,
        'q'     : group.q,
        'alpha' : alpha,
        'beta'  : beta,
        'x'     : x,
    }))
示例#2
0
Receiver chooses random poly S of degree k such that S(0) = alpha
Receiver's plan is to use R(x) = Q(x, S(x)) to learn P(alpha)
R(0) = Q(0, S(0)) = P(S(0)) = P(alpha)
"""
import random

from charm.toolbox.integergroup import IntegerGroupQ
from charm.core.math.integer import integer
from charm.core.math.integer import reduce as reduce_modulus
from utils import Poly, LI


SECURITY_PARAM = 20
G = IntegerGroupQ()
G.paramgen(SECURITY_PARAM)
g = G.randomGen()

k = 4
m = 4
d_p = 12 # Degree of P
d = d_p * k  # Degree of P_x

def main():
  # Receiver has alpha.
  alpha = G.random()

  # Sender has polynomial P.
  P = Poly([G.random() for _ in range(d_p + 1)])

  # Sender generates random masking poly P_x
  P_x = Poly([G.random() for _ in range(d + 1)])
示例#3
0
class OneOfTwo(Protocol):
    def __init__(self):
        super().__init__(None)

        sender_states = {
            1: self.sender_state_1,
            3: self.sender_state_3,
            5: self.sender_state_5,
        }

        receiver_states = {
            2: self.receiver_state_2,
            4: self.receiver_state_4,
        }

        sender_trans = {1: 3, 3: 5}
        receiver_trans = {2: 4}

        self.group = IntegerGroupQ()
        self.group.paramgen(SECURITY_PARAM)

        Protocol.addPartyType(self, SENDER, sender_states, sender_trans, True)
        Protocol.addPartyType(self, RECEIVER, receiver_states, receiver_trans)

    def sender_state_1(self):
        print('Sender generates random value c and computes C = g ^ c.')

        g = self.group.randomGen()
        c = self.group.random()
        C = g**c
        super().setState(3)
        super().store(('g', g))
        return {'g': g, 'C': C}

    def receiver_state_2(self, data):
        print('Receiver got C, generates PKs and sends to sender.')
        C, g = data['C'], data['g']
        k = self.group.random()
        super().store(('g', g), ('k', k))
        PK_0 = g**k
        PK_1 = C / (g**k)
        super().setState(4)
        return {'PK_0': PK_0, 'PK_1': PK_1}

    def sender_state_3(self, data):
        PK_0, PK_1 = data['PK_0'], data['PK_1']
        print('Sender receives PKs, gets messages and calculates.')
        g = self.db['g']
        r0 = self.group.random()
        r1 = self.group.random()
        m0 = b"message 0"
        m1 = b"message 1"
        super().store(
            ('m0', m0),
            ('m1', m1),
        )
        c0 = (g**r0, xor(get_hash(PK_0**r0), m0).hex())
        c1 = (g**r1, xor(get_hash(PK_1**r1), m1).hex())
        super().setState(5)
        return {'c0': c0, 'c1': c1}

    def receiver_state_4(self, data):
        c0 = data['c0']
        k, = super().get(['k'])
        w0 = bytes.fromhex(c0[1])
        H = c0[0]**k
        decoded_msg = xor(get_hash(H), w0)
        super().setState(None)
        return {'decoded_msg': decoded_msg.hex()}

    def sender_state_5(self, data):
        decoded_msg = bytes.fromhex(data['decoded_msg'])
        m0, m1 = super().get(['m0', 'm1'])
        assert decoded_msg == m0
        super().setState(None)
        return None