README.md
Rendering markdown...
#!/usr/bin/env python
import math
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
RAND_MAX = 0x7fffffff
# from https://github.com/qbx2/python_glibc_random
def glibc_prng(seed):
int32 = lambda x: x&0xffffffff-0x100000000 if x&0xffffffff>0x7fffffff else x&0xffffffff
int64 = lambda x: x&0xffffffffffffffff-0x10000000000000000 if x&0xffffffffffffffff>0x7fffffffffffffff else x&0xffffffffffffffff
r = [0] * 344
r[0] = seed
for i in range(1, 31):
r[i] = int32(int64(16807 * r[i-1]) % 0x7fffffff)
if r[i] < 0:
r[i] = int32(r[i] + 0x7fffffff)
for i in range(31, 34):
r[i] = int32(r[i-31])
for i in range(34, 344):
r[i] = int32(r[i-31] + r[i-3])
i = 344 - 1
while True:
i += 1
r.append(int32(r[i-31] + r[i-3]))
yield int32((r[i]&0xffffffff) >> 1)
def random(seed, l, u):
prng = glibc_prng(seed)
r = float(next(prng))%RAND_MAX / RAND_MAX
return int(math.floor(r*(u-l+1))+l)
def encrypt(key, val):
padding = (key.n.bit_length()+7)>>3
return key.encrypt(val.ljust(padding, "\x00"),1)[0].encode("hex")
def pubKey(n, e):
return RSA.construct((long(n,16), long(e, 16)))