bip38


Namebip38 JSON
Version 0.2.1 PyPI version JSON
download
home_pagehttps://github.com/meherett/python-bip38
SummaryPython library for implementation of Bitcoin Improvement Proposal - 0038 / BIP38 protocol.
upload_time2023-10-14 22:51:20
maintainer
docs_urlNone
authorMeheret Tesfaye Batu
requires_python>=3.9,<4
licenseMIT
keywords bip38 bitcoin private-key pure-python encrypt decrypt passphrase wif bip-0038
VCS
bugtrack_url
requirements pyaes scrypt six
Travis-CI
coveralls test coverage
            # Bitcoin Improvement Proposal - 0038 / BIP38

[![Build Status](https://app.travis-ci.com/meherett/python-bip38.svg?branch=master)](https://app.travis-ci.com/meherett/python-bip38)
[![PyPI Version](https://img.shields.io/pypi/v/bip38.svg?color=blue)](https://pypi.org/project/bip38)
[![Documentation Status](https://readthedocs.org/projects/bip38/badge/?version=master)](https://bip38.readthedocs.io)
[![PyPI License](https://img.shields.io/pypi/l/bip38?color=black)](https://pypi.org/project/bip38)
[![PyPI Python Version](https://img.shields.io/pypi/pyversions/bip38.svg)](https://pypi.org/project/bip38)
[![Coverage Status](https://coveralls.io/repos/github/meherett/python-bip38/badge.svg?branch=master)](https://coveralls.io/github/meherett/python-bip38)

Python library for implementation of Bitcoin Improvement Proposal - 0038 / BIP38 protocol. It supports both [No EC-multiply](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki#encryption-when-ec-multiply-flag-is-not-used) and [EC-multiply](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki#encryption-when-ec-multiply-mode-is-used) modes.

BIP38 is a cryptographic standard that defines a method for encrypting and securing private keys associated with Bitcoin addresses. It provides a way to create encrypted versions of private keys, which can then be decrypted using a passphrase. This adds an additional layer of security to the process of storing and transmitting private keys.

By encrypting a private key with BIP38, users can protect their funds even if the encrypted private key is exposed. This is because an attacker would need to know the passphrase in order to decrypt the private key and gain access to the associated funds. BIP38 encryption is often used to create "paper wallets" or physical copies of Bitcoin private keys that can be stored offline for enhanced security.

For more info see the [Passphrase-protected private key - BIP38](https://en.bitcoin.it/wiki/BIP_0038) spec.

## Installation

The easiest way to install `bip38` is via pip:

```
pip install bip38
```

If you want to run the latest version of the code, you can install from the git:

```
pip install git+git://github.com/meherett/python-bip38.git
```

## Quick Usage

##### no EC multiply:

```python
#!/usr/bin/env python3

from bip38 import (
    private_key_to_wif, bip38_encrypt, bip38_decrypt
)
from typing import (
    List, Literal
)

import json

# Private key
PRIVATE_KEY: str = "cbf4b9f70470856bb4f40f80b87edb90865997ffee6df315ab166d713af433a5"
# Passphrase / password
PASSPHRASE: str = "meherett"  # u"\u03D2\u0301\u0000\U00010400\U0001F4A9"
# Network type
NETWORK: Literal["mainnet", "testnet"] = "mainnet"
# To show detail
DETAIL: bool = True
# Wallet important format's
WIFs: List[str] = [
    private_key_to_wif(private_key=PRIVATE_KEY, wif_type="wif"),  # No compression
    private_key_to_wif(private_key=PRIVATE_KEY, wif_type="wif-compressed")  # Compression
]

for WIF in WIFs:
    
    print("WIF:", WIF)

    encrypted_wif: str = bip38_encrypt(
        wif=WIF, passphrase=PASSPHRASE, network=NETWORK
    )
    print("BIP38 Encrypted WIF:", encrypted_wif)
    
    print("BIP38 Decrypted:", json.dumps(bip38_decrypt(
        encrypted_wif=encrypted_wif, passphrase=PASSPHRASE, network=NETWORK, detail=DETAIL
    ), indent=4))

    print("-" * 125)
```

<details open>
  <summary>Output</summary><br/>

```shell
WFI: 5KN7MzqK5wt2TP1fQCYyHBtDrXdJuXbUzm4A9rKAteGu3Qi5CVR
BIP38 Encrypted WIF: 6PRVWUbkzNehVoPSCKYviigdnwsck69PLiMPpTVWGENzUAy7spnAZqnxit
BIP38 Decrypted: {
    "wif": "5KN7MzqK5wt2TP1fQCYyHBtDrXdJuXbUzm4A9rKAteGu3Qi5CVR",
    "private_key": "cbf4b9f70470856bb4f40f80b87edb90865997ffee6df315ab166d713af433a5",
    "wif_type": "wif",
    "public_key": "04d2ce831dd06e5c1f5b1121ef34c2af4bcb01b126e309234adbc3561b60c9360ea7f23327b49ba7f10d17fad15f068b8807dbbc9e4ace5d4a0b40264eefaf31a4",
    "public_key_type": "uncompressed",
    "seed": null,
    "address": "1Jq6MksXQVWzrznvZzxkV6oY57oWXD9TXB",
    "lot": null,
    "sequence": null
}
-----------------------------------------------------------------------------------------------------------------------------
WFI: L44B5gGEpqEDRS9vVPz7QT35jcBG2r3CZwSwQ4fCewXAhAhqGVpP
BIP38 Encrypted WIF: 6PYNKZ1EASfdDgcUgtxxRi7DkYPTXzwYUzEqzDxv2H8QbeKDV9D9wBWUA7
BIP38 Decrypted: {
    "wif": "L44B5gGEpqEDRS9vVPz7QT35jcBG2r3CZwSwQ4fCewXAhAhqGVpP",
    "private_key": "cbf4b9f70470856bb4f40f80b87edb90865997ffee6df315ab166d713af433a5",
    "wif_type": "wif-compressed",
    "public_key": "02d2ce831dd06e5c1f5b1121ef34c2af4bcb01b126e309234adbc3561b60c9360e",
    "public_key_type": "compressed",
    "seed": null,
    "address": "164MQi977u9GUteHr4EPH27VkkdxmfCvGW",
    "lot": null,
    "sequence": null
}
-----------------------------------------------------------------------------------------------------------------------------
```
</details>

##### EC multiply:

```python
#!/usr/bin/env python3

from bip38 import (
    intermediate_code, create_new_encrypted_wif, confirm_code, bip38_decrypt
)
from typing import (
    List, Literal
)

import json
import os

# Passphrase / password
PASSPHRASE: str = "meherett"  # u"\u03D2\u0301\u0000\U00010400\U0001F4A9"
# Network type
NETWORK: Literal["mainnet", "testnet"] = "mainnet"
# To show detail
DETAIL: bool = True
# List of samples with owner salt, seed, public key type, lot, and sequence
SAMPLES: List[dict] = [
    # Random owner salt & seed, No compression, No lot & sequence
    {"owner_salt": os.urandom(8), "seed": os.urandom(24), "public_key_type": "uncompressed", "lot": None, "sequence": None},
    # Random owner salt & seed, No compression, With lot & sequence
    {"owner_salt": os.urandom(8), "seed": os.urandom(24), "public_key_type": "uncompressed", "lot": 863741, "sequence": 1},
    # Random owner salt & seed, Compression, No lot & sequence
    {"owner_salt": os.urandom(8), "seed": os.urandom(24), "public_key_type": "compressed", "lot": None, "sequence": None},
    # Random owner salt & seed, Compression, With lot & sequence
    {"owner_salt": os.urandom(8), "seed": os.urandom(24), "public_key_type": "compressed", "lot": 863741, "sequence": 1},
    # With owner salt & seed, No compression, No lot & sequence
    {"owner_salt": "75ed1cdeb254cb38", "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c", "public_key_type": "uncompressed", "lot": None, "sequence": None},
    # With owner salt & seed, No compression, With lot & sequence
    {"owner_salt": "75ed1cdeb254cb38", "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c", "public_key_type": "uncompressed", "lot": 567885, "sequence": 1},
    # With owner salt & seed, Compression, No lot & sequence
    {"owner_salt": "75ed1cdeb254cb38", "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c", "public_key_type": "compressed", "lot": None, "sequence": None},
    # With owner salt & seed, Compression, With lot & sequence
    {"owner_salt": "75ed1cdeb254cb38", "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c", "public_key_type": "compressed", "lot": 369861, "sequence": 1},
]

for SAMPLE in SAMPLES:
    
    intermediate_passphrase: str = intermediate_code(
        passphrase=PASSPHRASE, owner_salt=SAMPLE["owner_salt"], lot=SAMPLE["lot"], sequence=SAMPLE["sequence"]
    )
    print("Intermediate Passphrase:", intermediate_passphrase)

    encrypted_wif: dict = create_new_encrypted_wif(
        intermediate_passphrase=intermediate_passphrase, public_key_type=SAMPLE["public_key_type"], seed=SAMPLE["seed"], network=NETWORK
    )
    print("Encrypted WIF:", json.dumps(encrypted_wif, indent=4))

    print("Confirm Code:", json.dumps(confirm_code(
        passphrase=PASSPHRASE, confirmation_code=encrypted_wif["confirmation_code"], network=NETWORK, detail=DETAIL
    ), indent=4))

    print("BIP38 Decrypted:", json.dumps(bip38_decrypt(
        encrypted_wif=encrypted_wif["encrypted_wif"], passphrase=PASSPHRASE, network=NETWORK, detail=DETAIL
    ), indent=4))

    print("-" * 125)
```

<details>
  <summary>Output</summary><br/>

```shell
Intermediate Passphrase: passphraseqtFiMLZSKYBJo6ZdivCqkPyMX3bnPFnedQRtEHWHmADXqEfSyJHE1CLuTbF6Wf
Encrypted WIF: {
    "encrypted_wif": "6PfPd3hFPNjBMqirrvSSgEtDnErh9BzqK1NUdk6fiQCaN7LwdGFus4PhQV",
    "confirmation_code": "cfrm38V5QE7EN2eF9SfWsesQCjJZSoSjc5YiqLDCgEJoqEDoV2D9f7NRXSqQHsWb3MKogaN8zAs",
    "public_key": "0412bb1ec0a2fa1e7c90f4061578d8deeaa6984c9ec5c37717546fb0d127573a03f3050a9f7cb24f62e107c43470388531193fcd8b878618cf74e1d71698069e07",
    "seed": "d010fe7f60a25982f3ee7e056e1bcd027f1c15bd26ddd221",
    "public_key_type": "uncompressed",
    "address": "1CHsGDzDbZJPVKiC9hUKe1hnAevwu5RTKi"
}
Confirm Code: {
    "public_key": "0412bb1ec0a2fa1e7c90f4061578d8deeaa6984c9ec5c37717546fb0d127573a03f3050a9f7cb24f62e107c43470388531193fcd8b878618cf74e1d71698069e07",
    "public_key_type": "uncompressed",
    "address": "1CHsGDzDbZJPVKiC9hUKe1hnAevwu5RTKi",
    "lot": null,
    "sequence": null
}
BIP38 Decrypted: {
    "wif": "5Jp53JGVEkX2dxXXJyb2UdJw3259yk3YjJCdhcHA3eXpJsr6PBB",
    "private_key": "83348354ac6638ad7ea78505bd85ff96485e17edcffe85572df9a66f997e1324",
    "wif_type": "wif",
    "public_key": "0412bb1ec0a2fa1e7c90f4061578d8deeaa6984c9ec5c37717546fb0d127573a03f3050a9f7cb24f62e107c43470388531193fcd8b878618cf74e1d71698069e07",
    "public_key_type": "uncompressed",
    "seed": "d010fe7f60a25982f3ee7e056e1bcd027f1c15bd26ddd221",
    "address": "1CHsGDzDbZJPVKiC9hUKe1hnAevwu5RTKi",
    "lot": null,
    "sequence": null
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphrasedcXyya37d7imwPshCWV77N6SdDCXCGkbUDQ8dgg39Xutzej2UoNTRXCWjcVSk3
Encrypted WIF: {
    "encrypted_wif": "6PgHqxpPU2tA4rqjL5gMMkqeahFRRDDe3g1jJy5mhQdNasT1WtwEkzGcdk",
    "confirmation_code": "cfrm38V8LPy6dJTRpd7Qs74zLAdE26F3ZGqJ1Dmr5HheKY2miBwbJMdk1qY6VhZDjNJkitu5Di5",
    "public_key": "049b3dcf56a38df3a2437055f2ad3aec950a54f7205bbcc9949d5299ee4e0215d0924a756dce3baf3356da8465341ebf1c580c4ee13e2602508df57ec49a15e981",
    "seed": "8195ac15d84c139531faec482a9d312f86f79242acb728a7",
    "public_key_type": "uncompressed",
    "address": "17YeFTwCoxVhz5P8KiGHv4d8JwUEwPUbhj"
}
Confirm Code: {
    "public_key": "049b3dcf56a38df3a2437055f2ad3aec950a54f7205bbcc9949d5299ee4e0215d0924a756dce3baf3356da8465341ebf1c580c4ee13e2602508df57ec49a15e981",
    "public_key_type": "uncompressed",
    "address": "17YeFTwCoxVhz5P8KiGHv4d8JwUEwPUbhj",
    "lot": 863741,
    "sequence": 1
}
BIP38 Decrypted: {
    "wif": "5KGpex1ZJaPoG2L6cHtzAU1nM9un8nw3uD8d6v8xGJs6M6q9qQj",
    "private_key": "bff2e24adfd0323ecd0b969cb3768adba578a0ea503306fd647e6b11e8739d70",
    "wif_type": "wif",
    "public_key": "049b3dcf56a38df3a2437055f2ad3aec950a54f7205bbcc9949d5299ee4e0215d0924a756dce3baf3356da8465341ebf1c580c4ee13e2602508df57ec49a15e981",
    "public_key_type": "uncompressed",
    "seed": "8195ac15d84c139531faec482a9d312f86f79242acb728a7",
    "address": "17YeFTwCoxVhz5P8KiGHv4d8JwUEwPUbhj",
    "lot": 863741,
    "sequence": 1
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphraseoH4GEqnBR53ipb9gwLfbJM8nKMx4LnZPCzYbvgPyR2zYkF5DqKrW2gf8DZ8s7y
Encrypted WIF: {
    "encrypted_wif": "6PnYW3V9jp8sKA4aMEWJjBvNTRtVYBCSRWb6Yja6xZqBhVVrDXWSnYz2at",
    "confirmation_code": "cfrm38VUi8UMcgVUDQRSjjn1VxVLfHYQxphSRvAQYSU244oNwHoxt24UByEnUeqSbN6QatRVtaR",
    "public_key": "022604144840ed73bc5055916e2e114efe2a706ee71033b48644e3e322a2c58dab",
    "seed": "e0051112f4903c0bbe52dc698c031467bf4646040b6b12a3",
    "public_key_type": "compressed",
    "address": "1EVSAfcUHG8Ce2CF74QwW58wSr7WY4QBaH"
}
Confirm Code: {
    "public_key": "022604144840ed73bc5055916e2e114efe2a706ee71033b48644e3e322a2c58dab",
    "public_key_type": "compressed",
    "address": "1EVSAfcUHG8Ce2CF74QwW58wSr7WY4QBaH",
    "lot": null,
    "sequence": null
}
BIP38 Decrypted: {
    "wif": "Kz2v4F99WaPamvCC2LwGTwdr25TnUXUB991wKpVhHGxtJE6iAveq",
    "private_key": "53f56bb7fc1a9e9682aa55be6e501776fc9ac2369654c6c85b00b87d41ab8229",
    "wif_type": "wif-compressed",
    "public_key": "022604144840ed73bc5055916e2e114efe2a706ee71033b48644e3e322a2c58dab",
    "public_key_type": "compressed",
    "seed": "e0051112f4903c0bbe52dc698c031467bf4646040b6b12a3",
    "address": "1EVSAfcUHG8Ce2CF74QwW58wSr7WY4QBaH",
    "lot": null,
    "sequence": null
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphraseaWdkWraG6G7W9TCAhCtmoLXbFWdDYjrG8gtv2VPCY7mCvJgbFCoktRKm4ePsQU
Encrypted WIF: {
    "encrypted_wif": "6PoHWWXXJTibxUGKcVmyts86N8rcTHXJpAoj5VeRf2FhJqj2oQgCsHheKg",
    "confirmation_code": "cfrm38VX8GoZrei4jxLQKA6Mx2zSWkrQZPhxQW1FcCRjtizmQDoWoomm5SW63ESEAUuLkA8MFmc",
    "public_key": "025f4476d9d8c093a04499fe9d7fbd34533dae14a498a2506a90d6cfdda66e99b3",
    "seed": "1ac2513b9149124a0a0d697ae76cbb4583e85d4a652330a6",
    "public_key_type": "compressed",
    "address": "1ESHxrqxMLrdzwfif9nQbq4PTGhDGi1uq2"
}
Confirm Code: {
    "public_key": "025f4476d9d8c093a04499fe9d7fbd34533dae14a498a2506a90d6cfdda66e99b3",
    "public_key_type": "compressed",
    "address": "1ESHxrqxMLrdzwfif9nQbq4PTGhDGi1uq2",
    "lot": 863741,
    "sequence": 1
}
BIP38 Decrypted: {
    "wif": "L2otjF2N8EpKvh541jw1n3MrXZLpnCfQ2GB4eiGZLFwoSj1UHprw",
    "private_key": "a6c57a43bf2a8ecc153b6b1e8807ec2409033616d4fc98a4edae277c02312eb7",
    "wif_type": "wif-compressed",
    "public_key": "025f4476d9d8c093a04499fe9d7fbd34533dae14a498a2506a90d6cfdda66e99b3",
    "public_key_type": "compressed",
    "seed": "1ac2513b9149124a0a0d697ae76cbb4583e85d4a652330a6",
    "address": "1ESHxrqxMLrdzwfif9nQbq4PTGhDGi1uq2",
    "lot": 863741,
    "sequence": 1
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphraseondJwvQGEWFNrNJRPi4G5XAL5SU777GwTNtqmDXqA3CGP7HXfH6AdBxxc5WUKC
Encrypted WIF: {
    "encrypted_wif": "6PfP7T3iQ5jLJLsH5DneySLLF5bhd879DHW87Pxzwtwvn2ggcncxsNKN5c",
    "confirmation_code": "cfrm38V5NZfTZKRaRDTvFAMkNKqKAxTxdDjDdb5RpFfXrVRw7Nov5m2iP3K1Eg5QQRxs52kgapy",
    "public_key": "04cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b09e25cb1d8628cd559c6c57c627fa486b8d452da89c1e9778ea967822188990a4",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "public_key_type": "uncompressed",
    "address": "18VLTHgu95JPi1iLRtN2WwYroAHvHwE2Ws"
}
Confirm Code: {
    "public_key": "04cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b09e25cb1d8628cd559c6c57c627fa486b8d452da89c1e9778ea967822188990a4",
    "public_key_type": "uncompressed",
    "address": "18VLTHgu95JPi1iLRtN2WwYroAHvHwE2Ws",
    "lot": null,
    "sequence": null
}
BIP38 Decrypted: {
    "wif": "5Jh21edvnWUXFjRz8mDVN3CSPp1CyTuUSFBKZeWYU726R6MW3ux",
    "private_key": "733134eb516f94aa56ab7ef0874a0d71daf38c5c009dec2a1261861a15889631",
    "wif_type": "wif",
    "public_key": "04cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b09e25cb1d8628cd559c6c57c627fa486b8d452da89c1e9778ea967822188990a4",
    "public_key_type": "uncompressed",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "address": "18VLTHgu95JPi1iLRtN2WwYroAHvHwE2Ws",
    "lot": null,
    "sequence": null
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphraseb7ruSNPsLdQF7t1gh7fs1xvWB4MKDssFQwL11EHkVr4njFX5PtsCUqQqwzh9rS
Encrypted WIF: {
    "encrypted_wif": "6PgKxJUke6BcDc1XuvPDKCD9krZEebapef98SJ3YAjWQHtR3EVsaeK62ja",
    "confirmation_code": "cfrm38V8TGcdd9WSGpaB56JaiW7cbvv1ZD89BHjBGu7S7yUFGcht8CqFQoexCHCoiCp4JzsH1Pk",
    "public_key": "049afcaa528358eddf54634fee9505e90b9572f8733b94260c94d20b563a65a1c94c338d5c09d20c5895d89bd5a2ba39f96ae4b1cf637828714c432042172723b6",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "public_key_type": "uncompressed",
    "address": "1DkQJuST62GkJP9kss68fHT8ftLf4SmLVT"
}
Confirm Code: {
    "public_key": "049afcaa528358eddf54634fee9505e90b9572f8733b94260c94d20b563a65a1c94c338d5c09d20c5895d89bd5a2ba39f96ae4b1cf637828714c432042172723b6",
    "public_key_type": "uncompressed",
    "address": "1DkQJuST62GkJP9kss68fHT8ftLf4SmLVT",
    "lot": 567885,
    "sequence": 1
}
BIP38 Decrypted: {
    "wif": "5JGYLxWwyh9agrM6u63RadubRFjTxbDtvBcQ5EywZrHXBLpPrZW",
    "private_key": "3b9d38cb7d1d97efad80b3934cb1928ae70179317ea4657aaffcdff029f43b90",
    "wif_type": "wif",
    "public_key": "049afcaa528358eddf54634fee9505e90b9572f8733b94260c94d20b563a65a1c94c338d5c09d20c5895d89bd5a2ba39f96ae4b1cf637828714c432042172723b6",
    "public_key_type": "uncompressed",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "address": "1DkQJuST62GkJP9kss68fHT8ftLf4SmLVT",
    "lot": 567885,
    "sequence": 1
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphraseondJwvQGEWFNrNJRPi4G5XAL5SU777GwTNtqmDXqA3CGP7HXfH6AdBxxc5WUKC
Encrypted WIF: {
    "encrypted_wif": "6PnUVPinrvPGwoYJK3GbGBNgFuqEXmfvagE4QiAxj7yrZp4i29p22MrY5r",
    "confirmation_code": "cfrm38VUV4NK45caNN5aomS3dSQLT3FVHq556kehuZX1RNuPs8ArWjw18KCCjyTXktVCDBW65pZ",
    "public_key": "02cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b0",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "public_key_type": "compressed",
    "address": "1BPmkfRYzPAkeErMS6DLDYxPvQEEkoVRz1"
}
Confirm Code: {
    "public_key": "02cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b0",
    "public_key_type": "compressed",
    "address": "1BPmkfRYzPAkeErMS6DLDYxPvQEEkoVRz1",
    "lot": null,
    "sequence": null
}
BIP38 Decrypted: {
    "wif": "L15dTs7zPs6UY2HHBGA8BrhV5gTurDkc6RaYw6ZPtdZptsuPR7K3",
    "private_key": "733134eb516f94aa56ab7ef0874a0d71daf38c5c009dec2a1261861a15889631",
    "wif_type": "wif-compressed",
    "public_key": "02cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b0",
    "public_key_type": "compressed",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "address": "1BPmkfRYzPAkeErMS6DLDYxPvQEEkoVRz1",
    "lot": null,
    "sequence": null
}
-----------------------------------------------------------------------------------------------------------------------------
Intermediate Passphrase: passphraseb7ruSNDGP7cmnFHQpmos7TeAy26AFN4GyRTBqq6hiaFbQzQBvirD9oHsafQvzd
Encrypted WIF: {
    "encrypted_wif": "6PoEPBnJjm8UAiSGWQEKKNq9V2GMHqKkTcUqUFzsaX7wgjpQWR2qWPdnpt",
    "confirmation_code": "cfrm38VWx5xH1JFm5EVE3mzQvDPFkz7SqNiaFxhyUfp3Fjc2wdYmK7dGEWoW6irDPSrwoaxB5zS",
    "public_key": "024c5175a177a0b6cf0a3d06065345e2e2d0529ea0191ace3d7b003f304353511b",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "public_key_type": "compressed",
    "address": "1MQaLNgukYWRkNgtmc1dzJ13yFvJoW34u4"
}
Confirm Code: {
    "public_key": "024c5175a177a0b6cf0a3d06065345e2e2d0529ea0191ace3d7b003f304353511b",
    "public_key_type": "compressed",
    "address": "1MQaLNgukYWRkNgtmc1dzJ13yFvJoW34u4",
    "lot": 369861,
    "sequence": 1
}
BIP38 Decrypted: {
    "wif": "KzFbTBirbEEtEPgWL3xhohUcrg6yUmJupAGrid7vBP9F2Vh8GTUB",
    "private_key": "5a7b39eef5d02551b2d362384e57f9823a1c9bed48a260af920a8bb5d6ad971f",
    "wif_type": "wif-compressed",
    "public_key": "024c5175a177a0b6cf0a3d06065345e2e2d0529ea0191ace3d7b003f304353511b",
    "public_key_type": "compressed",
    "seed": "99241d58245c883896f80843d2846672d7312e6195ca1a6c",
    "address": "1MQaLNgukYWRkNgtmc1dzJ13yFvJoW34u4",
    "lot": 369861,
    "sequence": 1
}
-----------------------------------------------------------------------------------------------------------------------------
```
</details>

## Development

To get started, just fork this repo, clone it locally, and run:

```
pip install -e .[tests,docs] -r requirements.txt
```

## Testing

You can run the tests with:

```
pytest
```

Or use `tox` to run the complete suite against the full set of build targets, or pytest to run specific 
tests against a specific version of Python.

## Contributing

Feel free to open an [issue](https://github.com/meherett/python-bip38/issues) if you find a problem,
or a pull request if you've solved an issue. And also any help in testing, development,
documentation and other tasks is highly appreciated and useful to the project.
There are tasks for contributors of all experience levels.

For more information, see the [CONTRIBUTING.md](https://github.com/meherett/python-bip38/blob/master/CONTRIBUTING.md) file.

## Donations

Buy me a coffee if You found this tool helpful:

- **BTC** - 12uaGVdX1t86FXLQ4yYPrRQDCK7xGGu82r
- **BTC / ETH / USDT** - [hd.wallet](https://ud.me/hd.wallet)

Thank you very much for your support.

## License

Distributed under the [MIT](https://github.com/meherett/python-bip38/blob/master/LICENSE) license. See ``LICENSE`` for more information.



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/meherett/python-bip38",
    "name": "bip38",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.9,<4",
    "maintainer_email": "",
    "keywords": "bip38,bitcoin,private-key,pure-python,encrypt,decrypt,passphrase,wif,bip-0038",
    "author": "Meheret Tesfaye Batu",
    "author_email": "meherett.batu@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/1a/6f/1cc24d2909002c02b7a2c899e7716e0a837e2c3835ea20dbaaec602b434f/bip38-0.2.1.tar.gz",
    "platform": null,
    "description": "# Bitcoin Improvement Proposal - 0038 / BIP38\n\n[![Build Status](https://app.travis-ci.com/meherett/python-bip38.svg?branch=master)](https://app.travis-ci.com/meherett/python-bip38)\n[![PyPI Version](https://img.shields.io/pypi/v/bip38.svg?color=blue)](https://pypi.org/project/bip38)\n[![Documentation Status](https://readthedocs.org/projects/bip38/badge/?version=master)](https://bip38.readthedocs.io)\n[![PyPI License](https://img.shields.io/pypi/l/bip38?color=black)](https://pypi.org/project/bip38)\n[![PyPI Python Version](https://img.shields.io/pypi/pyversions/bip38.svg)](https://pypi.org/project/bip38)\n[![Coverage Status](https://coveralls.io/repos/github/meherett/python-bip38/badge.svg?branch=master)](https://coveralls.io/github/meherett/python-bip38)\n\nPython library for implementation of Bitcoin Improvement Proposal - 0038 / BIP38 protocol. It supports both [No EC-multiply](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki#encryption-when-ec-multiply-flag-is-not-used) and [EC-multiply](https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki#encryption-when-ec-multiply-mode-is-used) modes.\n\nBIP38 is a cryptographic standard that defines a method for encrypting and securing private keys associated with Bitcoin addresses. It provides a way to create encrypted versions of private keys, which can then be decrypted using a passphrase. This adds an additional layer of security to the process of storing and transmitting private keys.\n\nBy encrypting a private key with BIP38, users can protect their funds even if the encrypted private key is exposed. This is because an attacker would need to know the passphrase in order to decrypt the private key and gain access to the associated funds. BIP38 encryption is often used to create \"paper wallets\" or physical copies of Bitcoin private keys that can be stored offline for enhanced security.\n\nFor more info see the [Passphrase-protected private key - BIP38](https://en.bitcoin.it/wiki/BIP_0038) spec.\n\n## Installation\n\nThe easiest way to install `bip38` is via pip:\n\n```\npip install bip38\n```\n\nIf you want to run the latest version of the code, you can install from the git:\n\n```\npip install git+git://github.com/meherett/python-bip38.git\n```\n\n## Quick Usage\n\n##### no EC multiply:\n\n```python\n#!/usr/bin/env python3\n\nfrom bip38 import (\n    private_key_to_wif, bip38_encrypt, bip38_decrypt\n)\nfrom typing import (\n    List, Literal\n)\n\nimport json\n\n# Private key\nPRIVATE_KEY: str = \"cbf4b9f70470856bb4f40f80b87edb90865997ffee6df315ab166d713af433a5\"\n# Passphrase / password\nPASSPHRASE: str = \"meherett\"  # u\"\\u03D2\\u0301\\u0000\\U00010400\\U0001F4A9\"\n# Network type\nNETWORK: Literal[\"mainnet\", \"testnet\"] = \"mainnet\"\n# To show detail\nDETAIL: bool = True\n# Wallet important format's\nWIFs: List[str] = [\n    private_key_to_wif(private_key=PRIVATE_KEY, wif_type=\"wif\"),  # No compression\n    private_key_to_wif(private_key=PRIVATE_KEY, wif_type=\"wif-compressed\")  # Compression\n]\n\nfor WIF in WIFs:\n    \n    print(\"WIF:\", WIF)\n\n    encrypted_wif: str = bip38_encrypt(\n        wif=WIF, passphrase=PASSPHRASE, network=NETWORK\n    )\n    print(\"BIP38 Encrypted WIF:\", encrypted_wif)\n    \n    print(\"BIP38 Decrypted:\", json.dumps(bip38_decrypt(\n        encrypted_wif=encrypted_wif, passphrase=PASSPHRASE, network=NETWORK, detail=DETAIL\n    ), indent=4))\n\n    print(\"-\" * 125)\n```\n\n<details open>\n  <summary>Output</summary><br/>\n\n```shell\nWFI: 5KN7MzqK5wt2TP1fQCYyHBtDrXdJuXbUzm4A9rKAteGu3Qi5CVR\nBIP38 Encrypted WIF: 6PRVWUbkzNehVoPSCKYviigdnwsck69PLiMPpTVWGENzUAy7spnAZqnxit\nBIP38 Decrypted: {\n    \"wif\": \"5KN7MzqK5wt2TP1fQCYyHBtDrXdJuXbUzm4A9rKAteGu3Qi5CVR\",\n    \"private_key\": \"cbf4b9f70470856bb4f40f80b87edb90865997ffee6df315ab166d713af433a5\",\n    \"wif_type\": \"wif\",\n    \"public_key\": \"04d2ce831dd06e5c1f5b1121ef34c2af4bcb01b126e309234adbc3561b60c9360ea7f23327b49ba7f10d17fad15f068b8807dbbc9e4ace5d4a0b40264eefaf31a4\",\n    \"public_key_type\": \"uncompressed\",\n    \"seed\": null,\n    \"address\": \"1Jq6MksXQVWzrznvZzxkV6oY57oWXD9TXB\",\n    \"lot\": null,\n    \"sequence\": null\n}\n-----------------------------------------------------------------------------------------------------------------------------\nWFI: L44B5gGEpqEDRS9vVPz7QT35jcBG2r3CZwSwQ4fCewXAhAhqGVpP\nBIP38 Encrypted WIF: 6PYNKZ1EASfdDgcUgtxxRi7DkYPTXzwYUzEqzDxv2H8QbeKDV9D9wBWUA7\nBIP38 Decrypted: {\n    \"wif\": \"L44B5gGEpqEDRS9vVPz7QT35jcBG2r3CZwSwQ4fCewXAhAhqGVpP\",\n    \"private_key\": \"cbf4b9f70470856bb4f40f80b87edb90865997ffee6df315ab166d713af433a5\",\n    \"wif_type\": \"wif-compressed\",\n    \"public_key\": \"02d2ce831dd06e5c1f5b1121ef34c2af4bcb01b126e309234adbc3561b60c9360e\",\n    \"public_key_type\": \"compressed\",\n    \"seed\": null,\n    \"address\": \"164MQi977u9GUteHr4EPH27VkkdxmfCvGW\",\n    \"lot\": null,\n    \"sequence\": null\n}\n-----------------------------------------------------------------------------------------------------------------------------\n```\n</details>\n\n##### EC multiply:\n\n```python\n#!/usr/bin/env python3\n\nfrom bip38 import (\n    intermediate_code, create_new_encrypted_wif, confirm_code, bip38_decrypt\n)\nfrom typing import (\n    List, Literal\n)\n\nimport json\nimport os\n\n# Passphrase / password\nPASSPHRASE: str = \"meherett\"  # u\"\\u03D2\\u0301\\u0000\\U00010400\\U0001F4A9\"\n# Network type\nNETWORK: Literal[\"mainnet\", \"testnet\"] = \"mainnet\"\n# To show detail\nDETAIL: bool = True\n# List of samples with owner salt, seed, public key type, lot, and sequence\nSAMPLES: List[dict] = [\n    # Random owner salt & seed, No compression, No lot & sequence\n    {\"owner_salt\": os.urandom(8), \"seed\": os.urandom(24), \"public_key_type\": \"uncompressed\", \"lot\": None, \"sequence\": None},\n    # Random owner salt & seed, No compression, With lot & sequence\n    {\"owner_salt\": os.urandom(8), \"seed\": os.urandom(24), \"public_key_type\": \"uncompressed\", \"lot\": 863741, \"sequence\": 1},\n    # Random owner salt & seed, Compression, No lot & sequence\n    {\"owner_salt\": os.urandom(8), \"seed\": os.urandom(24), \"public_key_type\": \"compressed\", \"lot\": None, \"sequence\": None},\n    # Random owner salt & seed, Compression, With lot & sequence\n    {\"owner_salt\": os.urandom(8), \"seed\": os.urandom(24), \"public_key_type\": \"compressed\", \"lot\": 863741, \"sequence\": 1},\n    # With owner salt & seed, No compression, No lot & sequence\n    {\"owner_salt\": \"75ed1cdeb254cb38\", \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\", \"public_key_type\": \"uncompressed\", \"lot\": None, \"sequence\": None},\n    # With owner salt & seed, No compression, With lot & sequence\n    {\"owner_salt\": \"75ed1cdeb254cb38\", \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\", \"public_key_type\": \"uncompressed\", \"lot\": 567885, \"sequence\": 1},\n    # With owner salt & seed, Compression, No lot & sequence\n    {\"owner_salt\": \"75ed1cdeb254cb38\", \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\", \"public_key_type\": \"compressed\", \"lot\": None, \"sequence\": None},\n    # With owner salt & seed, Compression, With lot & sequence\n    {\"owner_salt\": \"75ed1cdeb254cb38\", \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\", \"public_key_type\": \"compressed\", \"lot\": 369861, \"sequence\": 1},\n]\n\nfor SAMPLE in SAMPLES:\n    \n    intermediate_passphrase: str = intermediate_code(\n        passphrase=PASSPHRASE, owner_salt=SAMPLE[\"owner_salt\"], lot=SAMPLE[\"lot\"], sequence=SAMPLE[\"sequence\"]\n    )\n    print(\"Intermediate Passphrase:\", intermediate_passphrase)\n\n    encrypted_wif: dict = create_new_encrypted_wif(\n        intermediate_passphrase=intermediate_passphrase, public_key_type=SAMPLE[\"public_key_type\"], seed=SAMPLE[\"seed\"], network=NETWORK\n    )\n    print(\"Encrypted WIF:\", json.dumps(encrypted_wif, indent=4))\n\n    print(\"Confirm Code:\", json.dumps(confirm_code(\n        passphrase=PASSPHRASE, confirmation_code=encrypted_wif[\"confirmation_code\"], network=NETWORK, detail=DETAIL\n    ), indent=4))\n\n    print(\"BIP38 Decrypted:\", json.dumps(bip38_decrypt(\n        encrypted_wif=encrypted_wif[\"encrypted_wif\"], passphrase=PASSPHRASE, network=NETWORK, detail=DETAIL\n    ), indent=4))\n\n    print(\"-\" * 125)\n```\n\n<details>\n  <summary>Output</summary><br/>\n\n```shell\nIntermediate Passphrase: passphraseqtFiMLZSKYBJo6ZdivCqkPyMX3bnPFnedQRtEHWHmADXqEfSyJHE1CLuTbF6Wf\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PfPd3hFPNjBMqirrvSSgEtDnErh9BzqK1NUdk6fiQCaN7LwdGFus4PhQV\",\n    \"confirmation_code\": \"cfrm38V5QE7EN2eF9SfWsesQCjJZSoSjc5YiqLDCgEJoqEDoV2D9f7NRXSqQHsWb3MKogaN8zAs\",\n    \"public_key\": \"0412bb1ec0a2fa1e7c90f4061578d8deeaa6984c9ec5c37717546fb0d127573a03f3050a9f7cb24f62e107c43470388531193fcd8b878618cf74e1d71698069e07\",\n    \"seed\": \"d010fe7f60a25982f3ee7e056e1bcd027f1c15bd26ddd221\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"1CHsGDzDbZJPVKiC9hUKe1hnAevwu5RTKi\"\n}\nConfirm Code: {\n    \"public_key\": \"0412bb1ec0a2fa1e7c90f4061578d8deeaa6984c9ec5c37717546fb0d127573a03f3050a9f7cb24f62e107c43470388531193fcd8b878618cf74e1d71698069e07\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"1CHsGDzDbZJPVKiC9hUKe1hnAevwu5RTKi\",\n    \"lot\": null,\n    \"sequence\": null\n}\nBIP38 Decrypted: {\n    \"wif\": \"5Jp53JGVEkX2dxXXJyb2UdJw3259yk3YjJCdhcHA3eXpJsr6PBB\",\n    \"private_key\": \"83348354ac6638ad7ea78505bd85ff96485e17edcffe85572df9a66f997e1324\",\n    \"wif_type\": \"wif\",\n    \"public_key\": \"0412bb1ec0a2fa1e7c90f4061578d8deeaa6984c9ec5c37717546fb0d127573a03f3050a9f7cb24f62e107c43470388531193fcd8b878618cf74e1d71698069e07\",\n    \"public_key_type\": \"uncompressed\",\n    \"seed\": \"d010fe7f60a25982f3ee7e056e1bcd027f1c15bd26ddd221\",\n    \"address\": \"1CHsGDzDbZJPVKiC9hUKe1hnAevwu5RTKi\",\n    \"lot\": null,\n    \"sequence\": null\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphrasedcXyya37d7imwPshCWV77N6SdDCXCGkbUDQ8dgg39Xutzej2UoNTRXCWjcVSk3\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PgHqxpPU2tA4rqjL5gMMkqeahFRRDDe3g1jJy5mhQdNasT1WtwEkzGcdk\",\n    \"confirmation_code\": \"cfrm38V8LPy6dJTRpd7Qs74zLAdE26F3ZGqJ1Dmr5HheKY2miBwbJMdk1qY6VhZDjNJkitu5Di5\",\n    \"public_key\": \"049b3dcf56a38df3a2437055f2ad3aec950a54f7205bbcc9949d5299ee4e0215d0924a756dce3baf3356da8465341ebf1c580c4ee13e2602508df57ec49a15e981\",\n    \"seed\": \"8195ac15d84c139531faec482a9d312f86f79242acb728a7\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"17YeFTwCoxVhz5P8KiGHv4d8JwUEwPUbhj\"\n}\nConfirm Code: {\n    \"public_key\": \"049b3dcf56a38df3a2437055f2ad3aec950a54f7205bbcc9949d5299ee4e0215d0924a756dce3baf3356da8465341ebf1c580c4ee13e2602508df57ec49a15e981\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"17YeFTwCoxVhz5P8KiGHv4d8JwUEwPUbhj\",\n    \"lot\": 863741,\n    \"sequence\": 1\n}\nBIP38 Decrypted: {\n    \"wif\": \"5KGpex1ZJaPoG2L6cHtzAU1nM9un8nw3uD8d6v8xGJs6M6q9qQj\",\n    \"private_key\": \"bff2e24adfd0323ecd0b969cb3768adba578a0ea503306fd647e6b11e8739d70\",\n    \"wif_type\": \"wif\",\n    \"public_key\": \"049b3dcf56a38df3a2437055f2ad3aec950a54f7205bbcc9949d5299ee4e0215d0924a756dce3baf3356da8465341ebf1c580c4ee13e2602508df57ec49a15e981\",\n    \"public_key_type\": \"uncompressed\",\n    \"seed\": \"8195ac15d84c139531faec482a9d312f86f79242acb728a7\",\n    \"address\": \"17YeFTwCoxVhz5P8KiGHv4d8JwUEwPUbhj\",\n    \"lot\": 863741,\n    \"sequence\": 1\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphraseoH4GEqnBR53ipb9gwLfbJM8nKMx4LnZPCzYbvgPyR2zYkF5DqKrW2gf8DZ8s7y\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PnYW3V9jp8sKA4aMEWJjBvNTRtVYBCSRWb6Yja6xZqBhVVrDXWSnYz2at\",\n    \"confirmation_code\": \"cfrm38VUi8UMcgVUDQRSjjn1VxVLfHYQxphSRvAQYSU244oNwHoxt24UByEnUeqSbN6QatRVtaR\",\n    \"public_key\": \"022604144840ed73bc5055916e2e114efe2a706ee71033b48644e3e322a2c58dab\",\n    \"seed\": \"e0051112f4903c0bbe52dc698c031467bf4646040b6b12a3\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1EVSAfcUHG8Ce2CF74QwW58wSr7WY4QBaH\"\n}\nConfirm Code: {\n    \"public_key\": \"022604144840ed73bc5055916e2e114efe2a706ee71033b48644e3e322a2c58dab\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1EVSAfcUHG8Ce2CF74QwW58wSr7WY4QBaH\",\n    \"lot\": null,\n    \"sequence\": null\n}\nBIP38 Decrypted: {\n    \"wif\": \"Kz2v4F99WaPamvCC2LwGTwdr25TnUXUB991wKpVhHGxtJE6iAveq\",\n    \"private_key\": \"53f56bb7fc1a9e9682aa55be6e501776fc9ac2369654c6c85b00b87d41ab8229\",\n    \"wif_type\": \"wif-compressed\",\n    \"public_key\": \"022604144840ed73bc5055916e2e114efe2a706ee71033b48644e3e322a2c58dab\",\n    \"public_key_type\": \"compressed\",\n    \"seed\": \"e0051112f4903c0bbe52dc698c031467bf4646040b6b12a3\",\n    \"address\": \"1EVSAfcUHG8Ce2CF74QwW58wSr7WY4QBaH\",\n    \"lot\": null,\n    \"sequence\": null\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphraseaWdkWraG6G7W9TCAhCtmoLXbFWdDYjrG8gtv2VPCY7mCvJgbFCoktRKm4ePsQU\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PoHWWXXJTibxUGKcVmyts86N8rcTHXJpAoj5VeRf2FhJqj2oQgCsHheKg\",\n    \"confirmation_code\": \"cfrm38VX8GoZrei4jxLQKA6Mx2zSWkrQZPhxQW1FcCRjtizmQDoWoomm5SW63ESEAUuLkA8MFmc\",\n    \"public_key\": \"025f4476d9d8c093a04499fe9d7fbd34533dae14a498a2506a90d6cfdda66e99b3\",\n    \"seed\": \"1ac2513b9149124a0a0d697ae76cbb4583e85d4a652330a6\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1ESHxrqxMLrdzwfif9nQbq4PTGhDGi1uq2\"\n}\nConfirm Code: {\n    \"public_key\": \"025f4476d9d8c093a04499fe9d7fbd34533dae14a498a2506a90d6cfdda66e99b3\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1ESHxrqxMLrdzwfif9nQbq4PTGhDGi1uq2\",\n    \"lot\": 863741,\n    \"sequence\": 1\n}\nBIP38 Decrypted: {\n    \"wif\": \"L2otjF2N8EpKvh541jw1n3MrXZLpnCfQ2GB4eiGZLFwoSj1UHprw\",\n    \"private_key\": \"a6c57a43bf2a8ecc153b6b1e8807ec2409033616d4fc98a4edae277c02312eb7\",\n    \"wif_type\": \"wif-compressed\",\n    \"public_key\": \"025f4476d9d8c093a04499fe9d7fbd34533dae14a498a2506a90d6cfdda66e99b3\",\n    \"public_key_type\": \"compressed\",\n    \"seed\": \"1ac2513b9149124a0a0d697ae76cbb4583e85d4a652330a6\",\n    \"address\": \"1ESHxrqxMLrdzwfif9nQbq4PTGhDGi1uq2\",\n    \"lot\": 863741,\n    \"sequence\": 1\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphraseondJwvQGEWFNrNJRPi4G5XAL5SU777GwTNtqmDXqA3CGP7HXfH6AdBxxc5WUKC\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PfP7T3iQ5jLJLsH5DneySLLF5bhd879DHW87Pxzwtwvn2ggcncxsNKN5c\",\n    \"confirmation_code\": \"cfrm38V5NZfTZKRaRDTvFAMkNKqKAxTxdDjDdb5RpFfXrVRw7Nov5m2iP3K1Eg5QQRxs52kgapy\",\n    \"public_key\": \"04cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b09e25cb1d8628cd559c6c57c627fa486b8d452da89c1e9778ea967822188990a4\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"18VLTHgu95JPi1iLRtN2WwYroAHvHwE2Ws\"\n}\nConfirm Code: {\n    \"public_key\": \"04cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b09e25cb1d8628cd559c6c57c627fa486b8d452da89c1e9778ea967822188990a4\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"18VLTHgu95JPi1iLRtN2WwYroAHvHwE2Ws\",\n    \"lot\": null,\n    \"sequence\": null\n}\nBIP38 Decrypted: {\n    \"wif\": \"5Jh21edvnWUXFjRz8mDVN3CSPp1CyTuUSFBKZeWYU726R6MW3ux\",\n    \"private_key\": \"733134eb516f94aa56ab7ef0874a0d71daf38c5c009dec2a1261861a15889631\",\n    \"wif_type\": \"wif\",\n    \"public_key\": \"04cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b09e25cb1d8628cd559c6c57c627fa486b8d452da89c1e9778ea967822188990a4\",\n    \"public_key_type\": \"uncompressed\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"address\": \"18VLTHgu95JPi1iLRtN2WwYroAHvHwE2Ws\",\n    \"lot\": null,\n    \"sequence\": null\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphraseb7ruSNPsLdQF7t1gh7fs1xvWB4MKDssFQwL11EHkVr4njFX5PtsCUqQqwzh9rS\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PgKxJUke6BcDc1XuvPDKCD9krZEebapef98SJ3YAjWQHtR3EVsaeK62ja\",\n    \"confirmation_code\": \"cfrm38V8TGcdd9WSGpaB56JaiW7cbvv1ZD89BHjBGu7S7yUFGcht8CqFQoexCHCoiCp4JzsH1Pk\",\n    \"public_key\": \"049afcaa528358eddf54634fee9505e90b9572f8733b94260c94d20b563a65a1c94c338d5c09d20c5895d89bd5a2ba39f96ae4b1cf637828714c432042172723b6\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"1DkQJuST62GkJP9kss68fHT8ftLf4SmLVT\"\n}\nConfirm Code: {\n    \"public_key\": \"049afcaa528358eddf54634fee9505e90b9572f8733b94260c94d20b563a65a1c94c338d5c09d20c5895d89bd5a2ba39f96ae4b1cf637828714c432042172723b6\",\n    \"public_key_type\": \"uncompressed\",\n    \"address\": \"1DkQJuST62GkJP9kss68fHT8ftLf4SmLVT\",\n    \"lot\": 567885,\n    \"sequence\": 1\n}\nBIP38 Decrypted: {\n    \"wif\": \"5JGYLxWwyh9agrM6u63RadubRFjTxbDtvBcQ5EywZrHXBLpPrZW\",\n    \"private_key\": \"3b9d38cb7d1d97efad80b3934cb1928ae70179317ea4657aaffcdff029f43b90\",\n    \"wif_type\": \"wif\",\n    \"public_key\": \"049afcaa528358eddf54634fee9505e90b9572f8733b94260c94d20b563a65a1c94c338d5c09d20c5895d89bd5a2ba39f96ae4b1cf637828714c432042172723b6\",\n    \"public_key_type\": \"uncompressed\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"address\": \"1DkQJuST62GkJP9kss68fHT8ftLf4SmLVT\",\n    \"lot\": 567885,\n    \"sequence\": 1\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphraseondJwvQGEWFNrNJRPi4G5XAL5SU777GwTNtqmDXqA3CGP7HXfH6AdBxxc5WUKC\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PnUVPinrvPGwoYJK3GbGBNgFuqEXmfvagE4QiAxj7yrZp4i29p22MrY5r\",\n    \"confirmation_code\": \"cfrm38VUV4NK45caNN5aomS3dSQLT3FVHq556kehuZX1RNuPs8ArWjw18KCCjyTXktVCDBW65pZ\",\n    \"public_key\": \"02cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b0\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1BPmkfRYzPAkeErMS6DLDYxPvQEEkoVRz1\"\n}\nConfirm Code: {\n    \"public_key\": \"02cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b0\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1BPmkfRYzPAkeErMS6DLDYxPvQEEkoVRz1\",\n    \"lot\": null,\n    \"sequence\": null\n}\nBIP38 Decrypted: {\n    \"wif\": \"L15dTs7zPs6UY2HHBGA8BrhV5gTurDkc6RaYw6ZPtdZptsuPR7K3\",\n    \"private_key\": \"733134eb516f94aa56ab7ef0874a0d71daf38c5c009dec2a1261861a15889631\",\n    \"wif_type\": \"wif-compressed\",\n    \"public_key\": \"02cdcd8f846a73e75c8a845d1df19dc23031648c219d1efc6fe945cd089f3052b0\",\n    \"public_key_type\": \"compressed\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"address\": \"1BPmkfRYzPAkeErMS6DLDYxPvQEEkoVRz1\",\n    \"lot\": null,\n    \"sequence\": null\n}\n-----------------------------------------------------------------------------------------------------------------------------\nIntermediate Passphrase: passphraseb7ruSNDGP7cmnFHQpmos7TeAy26AFN4GyRTBqq6hiaFbQzQBvirD9oHsafQvzd\nEncrypted WIF: {\n    \"encrypted_wif\": \"6PoEPBnJjm8UAiSGWQEKKNq9V2GMHqKkTcUqUFzsaX7wgjpQWR2qWPdnpt\",\n    \"confirmation_code\": \"cfrm38VWx5xH1JFm5EVE3mzQvDPFkz7SqNiaFxhyUfp3Fjc2wdYmK7dGEWoW6irDPSrwoaxB5zS\",\n    \"public_key\": \"024c5175a177a0b6cf0a3d06065345e2e2d0529ea0191ace3d7b003f304353511b\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1MQaLNgukYWRkNgtmc1dzJ13yFvJoW34u4\"\n}\nConfirm Code: {\n    \"public_key\": \"024c5175a177a0b6cf0a3d06065345e2e2d0529ea0191ace3d7b003f304353511b\",\n    \"public_key_type\": \"compressed\",\n    \"address\": \"1MQaLNgukYWRkNgtmc1dzJ13yFvJoW34u4\",\n    \"lot\": 369861,\n    \"sequence\": 1\n}\nBIP38 Decrypted: {\n    \"wif\": \"KzFbTBirbEEtEPgWL3xhohUcrg6yUmJupAGrid7vBP9F2Vh8GTUB\",\n    \"private_key\": \"5a7b39eef5d02551b2d362384e57f9823a1c9bed48a260af920a8bb5d6ad971f\",\n    \"wif_type\": \"wif-compressed\",\n    \"public_key\": \"024c5175a177a0b6cf0a3d06065345e2e2d0529ea0191ace3d7b003f304353511b\",\n    \"public_key_type\": \"compressed\",\n    \"seed\": \"99241d58245c883896f80843d2846672d7312e6195ca1a6c\",\n    \"address\": \"1MQaLNgukYWRkNgtmc1dzJ13yFvJoW34u4\",\n    \"lot\": 369861,\n    \"sequence\": 1\n}\n-----------------------------------------------------------------------------------------------------------------------------\n```\n</details>\n\n## Development\n\nTo get started, just fork this repo, clone it locally, and run:\n\n```\npip install -e .[tests,docs] -r requirements.txt\n```\n\n## Testing\n\nYou can run the tests with:\n\n```\npytest\n```\n\nOr use `tox` to run the complete suite against the full set of build targets, or pytest to run specific \ntests against a specific version of Python.\n\n## Contributing\n\nFeel free to open an [issue](https://github.com/meherett/python-bip38/issues) if you find a problem,\nor a pull request if you've solved an issue. And also any help in testing, development,\ndocumentation and other tasks is highly appreciated and useful to the project.\nThere are tasks for contributors of all experience levels.\n\nFor more information, see the [CONTRIBUTING.md](https://github.com/meherett/python-bip38/blob/master/CONTRIBUTING.md) file.\n\n## Donations\n\nBuy me a coffee if You found this tool helpful:\n\n- **BTC** - 12uaGVdX1t86FXLQ4yYPrRQDCK7xGGu82r\n- **BTC / ETH / USDT** - [hd.wallet](https://ud.me/hd.wallet)\n\nThank you very much for your support.\n\n## License\n\nDistributed under the [MIT](https://github.com/meherett/python-bip38/blob/master/LICENSE) license. See ``LICENSE`` for more information.\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python library for implementation of Bitcoin Improvement Proposal - 0038 / BIP38 protocol.",
    "version": "0.2.1",
    "project_urls": {
        "Documentation": "https://bip38.readthedocs.io",
        "Homepage": "https://github.com/meherett/python-bip38",
        "Tracker": "https://github.com/meherett/python-bip38/issues"
    },
    "split_keywords": [
        "bip38",
        "bitcoin",
        "private-key",
        "pure-python",
        "encrypt",
        "decrypt",
        "passphrase",
        "wif",
        "bip-0038"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "682cc1a2d8821decc1e7b533966967682afe732c2966393c9be5428754f94de8",
                "md5": "5aeb5095d19f280ce77bdeb7a9982336",
                "sha256": "2a3851df1689ffbc4bcb6333ef81a722a6615c388100d72c78feb8948b6a7b48"
            },
            "downloads": -1,
            "filename": "bip38-0.2.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "5aeb5095d19f280ce77bdeb7a9982336",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9,<4",
            "size": 30003,
            "upload_time": "2023-10-14T22:51:18",
            "upload_time_iso_8601": "2023-10-14T22:51:18.402716Z",
            "url": "https://files.pythonhosted.org/packages/68/2c/c1a2d8821decc1e7b533966967682afe732c2966393c9be5428754f94de8/bip38-0.2.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1a6f1cc24d2909002c02b7a2c899e7716e0a837e2c3835ea20dbaaec602b434f",
                "md5": "e9350a7694a1b2ad4334f333d94e06f6",
                "sha256": "2cf22c800d9d5958088bfdccec5cdd335b9e254172b8a29c0f55fdabe743d560"
            },
            "downloads": -1,
            "filename": "bip38-0.2.1.tar.gz",
            "has_sig": false,
            "md5_digest": "e9350a7694a1b2ad4334f333d94e06f6",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9,<4",
            "size": 30814,
            "upload_time": "2023-10-14T22:51:20",
            "upload_time_iso_8601": "2023-10-14T22:51:20.649215Z",
            "url": "https://files.pythonhosted.org/packages/1a/6f/1cc24d2909002c02b7a2c899e7716e0a837e2c3835ea20dbaaec602b434f/bip38-0.2.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-10-14 22:51:20",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "meherett",
    "github_project": "python-bip38",
    "travis_ci": true,
    "coveralls": true,
    "github_actions": true,
    "requirements": [
        {
            "name": "pyaes",
            "specs": [
                [
                    "<",
                    "2"
                ],
                [
                    ">=",
                    "1.6.1"
                ]
            ]
        },
        {
            "name": "scrypt",
            "specs": [
                [
                    "<",
                    "1"
                ],
                [
                    ">=",
                    "0.8.20"
                ]
            ]
        },
        {
            "name": "six",
            "specs": [
                [
                    "<",
                    "2"
                ],
                [
                    ">=",
                    "1.16.0"
                ]
            ]
        }
    ],
    "tox": true,
    "lcname": "bip38"
}
        
Elapsed time: 0.12617s