def single_key(wif_version, is_main, password): n = 16384 p = 1 r = 8 seed = secrets.token_bytes(32) salt = secrets.token_bytes(8) k = CECKey() k.set_secretbytes(seed) pk = k.get_pubkey() wif = k.get_wif(wif_version.to_bytes(1, 'big')) address = key_to_p2sh_p2wpkh(pk, is_main) iv = secrets.token_bytes(AES.block_size) # 这里的salt, key的size以及n, p, r的值跟bitcoinj中的KeyCrypterScrypt定义一致 key = scrypt.hash(convert_to_byte_array(password.encode("utf-8")), salt, 16384, 8, 1, 32) obj = AES.new(key, AES.MODE_CBC, iv) # 加密数据必须是16位的整数倍,采用pkcs7进行pad,跟PaddedBufferedBlockCipher中的一致 ciphertext = obj.encrypt(pad(wif.encode('utf-8'), 16)) key_info = { 'pubkey': pk.hex(), 'wif': wif, 'address': address, 'salt': salt.hex(), 'n': n, 'p': p, 'r': r, 'iv': iv.hex(), 'cipher': ciphertext.hex() } return key_info
def print_wif_address(secret, compress=True): k = CECKey() k.set_secretbytes(bytes.fromhex(secret)) k.set_compressed(compress) pk = k.get_pubkey() print(k.get_wif(b'\x80'), key_to_p2pkh(pk, True))