You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.3 KiB
46 lines
1.3 KiB
2 years ago
|
import hmac
|
||
|
import struct
|
||
|
import hashlib
|
||
|
|
||
|
from binascii import hexlify, unhexlify
|
||
|
|
||
|
|
||
|
def pbkdf2(password, salt, iters, keylen, digestmod=hashlib.sha1):
|
||
|
"""Run the PBKDF2 (Password-Based Key Derivation Function 2) algorithm
|
||
|
and return the derived key. The arguments are:
|
||
|
password (bytes or bytearray) -- the input password
|
||
|
salt (bytes or bytearray) -- a cryptographic salt
|
||
|
iters (int) -- number of iterations
|
||
|
keylen (int) -- length of key to derive
|
||
|
digestmod -- a cryptographic hash function: either a module
|
||
|
supporting PEP 247, a hashlib constructor, or (in Python 3.4
|
||
|
or later) the name of a hash function.
|
||
|
"""
|
||
|
h = hmac.new(password, digestmod=digestmod)
|
||
|
|
||
|
def prf(data):
|
||
|
hm = h.copy()
|
||
|
hm.update(data)
|
||
|
return bytearray(hm.digest())
|
||
|
|
||
|
key = bytearray()
|
||
|
i = 1
|
||
|
while len(key) < keylen:
|
||
|
t = u = prf(salt + struct.pack('>i', i))
|
||
|
for _ in range(iters - 1):
|
||
|
u = prf(u)
|
||
|
t = bytearray(x ^ y for x, y in zip(t, u))
|
||
|
key += t
|
||
|
i += 1
|
||
|
return key[:keylen]
|
||
|
|
||
|
|
||
|
def re_gen_key(pwd, key_len):
|
||
|
password = pwd.encode()
|
||
|
salt = unhexlify(b'1234567878563412')
|
||
|
return hexlify(pbkdf2(password, salt, 500, int(key_len/2), hashlib.sha256)).decode()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
print(re_gen_key('Python测试', 16))
|