import binascii import simplesha3 hash = simplesha3.keccakc768 # SHA-3 winner with 384-bit output p = 2^384 - 2^128 - 2^96 + 2^32 - 1 # standard NIST P-384 prime k = GF(p) def secure(A,B): n = EllipticCurve([k(A),k(B)]).cardinality() return (n.is_prime() and (2*p+2-n).is_prime() and Integers(n)(p).multiplicative_order() * 100 >= n-1 and Integers(2*p+2-n)(p).multiplicative_order() * 100 >= 2*p+2-n-1) def str2int(seed): return Integer(seed.encode('hex'),16) A = p-3 S = 'CA9EBD338A9EE0E6862FD329062ABC06A793575A1C744F0EC24503A525F5D06E' B = str2int(hash(binascii.unhexlify(S))) # verifiably random if secure(A,B): print 'p',hex(p).upper() print 'A',hex(A).upper() print 'B',hex(B).upper() # output: # p FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF # A FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC # B BADA55EC3BE2AD1F9EEEA5881ECF95BBF3AC392526F01D4CD13E684C63A17CC4D5F271642AD83899113817A61006413D