def pbkdf2_bin(hash_fxn, password, salt, iterations, keylen=16):
# https://github.com/mitsuhiko/python-pbkdf2
_pack_int = struct.Struct('>I').pack
hashfunc = sha1
mac = hmac.new(password, None, hashfunc)
def _pseudorandom(x, mac=mac):
h = mac.copy()
h.update(x)
return map(ord, h.digest())
buf = []
for block in xrange(1, -(-keylen // mac.digest_size) + 1):
rv = u = _pseudorandom(salt + _pack_int(block))
for i in xrange(iterations - 1):
u = _pseudorandom("".join(map(chr, u)))
rv = itertools.starmap(operator.xor, itertools.izip(rv, u))
buf.extend(rv)
return "".join(map(chr, buf))[:keylen]
评论列表
文章目录