Skip to content

Commit 00983b9

Browse files
committed
Update README and App PDFs
1 parent 5624953 commit 00983b9

6 files changed

Lines changed: 204 additions & 174 deletions

File tree

App.org

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,24 @@ related to the Seed.
8282

8383
It is estimated that 20% of Bitcoin is already lost in the first 10 years of its existence,
8484
stored in wallet addresses that can never be accessed because the corresponding "Private Key"
85-
has been lost, or the password forgotten.
85+
has been lost, or the passphrase forgotten.
8686

8787
The statistical chances of anyone successfully passing a Cryptocurrency wallet Private Key +
88-
password or Seed to their heirs over a 50-year period is therefore very low. Since memory fades
88+
passphrase or Seed to their heirs over a 50-year period is therefore very low. Since memory fades
8989
and "safe" storage places are lost, destroyed or forgotten, this risk actually increases
9090
exponentially over time.
9191

92-
I estimate the probability of successfully inheriting such a Paper Wallet + password or BIP-39
92+
I estimate the probability of successfully inheriting such a Paper Wallet + passphrase or BIP-39
9393
Mnemonic protected Seed is probably less than 50%. Perhaps *much* less.
9494

95-
*** Why Not a BIP-38 Encrypted Wallet + Password?
95+
*** Why Not a BIP-38 Encrypted Wallet + Passphrase?
9696

9797
Have you ever forgotten a password to an online account?
9898

99-
Well, with a BIP-38 Encrypted Wallet + Password, there is /no password reset/ option; there is
100-
no way to recover the password.
99+
Well, with a BIP-38 Encrypted Wallet + passphrase, there is /no password reset/ option; there is
100+
no way to recover the passphrase.
101101

102-
If the Wallet is lost, there is of course no way to recover it, even if you have the password.
102+
If the Wallet is lost, there is of course no way to recover it, even if you have the passphrase.
103103

104104
This option is perhaps even less desirable than using a BIP-39 Mnemonic Seed phrase, because
105105
each and every Encrypted Wallet is exposed to this risk of loss.

App.pdf

8 Bytes
Binary file not shown.

App.txt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Table of Contents
4141
1. Security with Availability
4242
.. 1. SLIP-39 Mnemonic Recovery Cards
4343
..... 1. Why Not a BIP-39 Mnemonic Phrase?
44-
..... 2. Why Not a BIP-38 Encrypted Wallet + Password?
44+
..... 2. Why Not a BIP-38 Encrypted Wallet + Passphrase?
4545
.. 2. Paper Wallets
4646
..... 1. Walking-Around Money
4747
2. Affiliate Links
@@ -107,29 +107,29 @@ Windows)] <https://github.com/pjkundert/python-slip39/releases/latest>
107107
It is estimated that 20% of Bitcoin is already lost in the first 10
108108
years of its existence, stored in wallet addresses that can never be
109109
accessed because the corresponding "Private Key" has been lost, or the
110-
password forgotten.
110+
passphrase forgotten.
111111

112112
The statistical chances of anyone successfully passing a
113-
Cryptocurrency wallet Private Key + password or Seed to their heirs
113+
Cryptocurrency wallet Private Key + passphrase or Seed to their heirs
114114
over a 50-year period is therefore very low. Since memory fades and
115115
"safe" storage places are lost, destroyed or forgotten, this risk
116116
actually increases exponentially over time.
117117

118118
I estimate the probability of successfully inheriting such a Paper
119-
Wallet + password or BIP-39 Mnemonic protected Seed is probably less
119+
Wallet + passphrase or BIP-39 Mnemonic protected Seed is probably less
120120
than 50%. Perhaps *much* less.
121121

122122

123-
1.1.2 Why Not a BIP-38 Encrypted Wallet + Password?
124-
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
123+
1.1.2 Why Not a BIP-38 Encrypted Wallet + Passphrase?
124+
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
125125

126126
Have you ever forgotten a password to an online account?
127127

128-
Well, with a BIP-38 Encrypted Wallet + Password, there is /no password
129-
reset/ option; there is no way to recover the password.
128+
Well, with a BIP-38 Encrypted Wallet + passphrase, there is /no
129+
password reset/ option; there is no way to recover the passphrase.
130130

131131
If the Wallet is lost, there is of course no way to recover it, even
132-
if you have the password.
132+
if you have the passphrase.
133133

134134
This option is perhaps even less desirable than using a BIP-39
135135
Mnemonic Seed phrase, because each and every Encrypted Wallet is

README.org

Lines changed: 48 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,12 @@ USB drive for printing (or directly printed without the file being saved to disk
5353
to /illustrate/ what accounts are associated with the backed-up seed. Recovery of the seed to a
5454
[[https://shop.trezor.io/product/trezor-model-t?offer_id=15&aff_id=10388][Trezor "Model T"]] is simple, by entering the mnemonics right on the device.
5555

56-
We also support backup of existing insecure and unreliable BIP-39 recover phrases as SLIP-39
57-
Mnemonic cards, for existing BIP-39 hardware wallets like the [[https://shop.ledger.com/pages/ledger-nano-x?r=2cd1cb6ae51f][Ledger Nano]]! Recover from your
58-
existing BIP-39 Mnemonic, select "Using BIP-39", and generate a set of SLIP-39 Mnemonic cards.
59-
Later, use the SLIP-39 App to recover from your SLIP-39 Mnemonic cards, click "Using BIP-39" to get
60-
your BIP-39 Mnemonic back, and use it to recover your accounts to your Ledger (or other) hardware
61-
wallet.
56+
We also support backup of existing insecure and unreliable BIP-39 Seed Phrases as SLIP-39 Mnemonic
57+
cards, for existing BIP-39 hardware wallets like the [[https://shop.ledger.com/pages/ledger-nano-x?r=2cd1cb6ae51f][Ledger Nano]], etc.! Recover from your existing
58+
BIP-39 Seed Phrase Mnemonic, select "Using BIP-39" (and enter your BIP-39 passphrase), and generate
59+
a set of SLIP-39 Mnemonic cards. Later, use the SLIP-39 App to recover from your SLIP-39 Mnemonic
60+
cards, click "Using BIP-39" to get your BIP-39 Mnemonic back, and use it (and your passphrase) to
61+
recover your accounts to your Ledger (or other) hardware wallet.
6262
#+END_ABSTRACT
6363

6464
#+TOC: headlines 3
@@ -131,7 +131,7 @@ wallet.
131131
trustworthy, more likely to know each-other, need to collect more to recover the group), or lower
132132
(more trustworthy, less likely to collude, need less to recover).
133133

134-
* SLIP-39 Account Creation, Recovery and Address Generation
134+
* SLIP-39 Account Creation, Recovery and Generation
135135

136136
Generating a new SLIP-39 encoded Seed is easy, with results available as PDF and text. Any number
137137
of derived HD wallet account addresses can be generated from this Seed, and the Seed (and all
@@ -592,11 +592,10 @@ wallet.
592592

593593
#+LATEX: {\scriptsize
594594
#+BEGIN_SRC bash :exports both :results output
595-
slip39-generator --secret ffffffffffffffffffffffffffffffff --path '../-3' 2>&1
595+
echo ffffffffffffffffffffffffffffffff | slip39-generator --secret - --path '../-3' 2>&1
596596
#+END_SRC
597597

598598
#+RESULTS:
599-
: 2022-04-21 06:32:43 slip39.generator It is recommended to not use '-s|--secret <hex>'; specify '-' to read from input
600599
: 0: [["ETH", "m/44'/60'/0'/0/0", "0x824b174803e688dE39aF5B3D7Cd39bE6515A19a1"], ["BTC", "m/84'/0'/0'/0/0", "bc1q9yscq3l2yfxlvnlk3cszpqefparrv7tk24u6pl"]]
601600
: 1: [["ETH", "m/44'/60'/0'/0/1", "0x8D342083549C635C0494d3c77567860ee7456963"], ["BTC", "m/84'/0'/0'/0/1", "bc1qnec684yvuhfrmy3q856gydllsc54p2tx9w955c"]]
602601
: 2: [["ETH", "m/44'/60'/0'/0/2", "0x52787E24965E1aBd691df77827A3CfA90f0166AA"], ["BTC", "m/84'/0'/0'/0/2", "bc1q2snj0zcg23dvjpw7m9lxtu0ap0hfl5tlddq07j"]]
@@ -633,11 +632,11 @@ wallet.
633632
#+RESULTS:
634633
:
635634
:
636-
: nonce: a01325494860145c3074d278c5bdb75e08ab2189e18d69d99a355321
637-
: 0: 13e4aeb7c1b5bbb75fd453e2d6c105932eadb747fc948472a290ae9aa0ceb703786b834e39986418b9bc9545d51bb48bcc457e3bce3725bc6bd42bc266d48ed75e6c67e1cedb6068a627f84362d6cfa26d3b580fcbdaf0c476d3081bd5fbe54f93e938cafb2cf80765ee548d7f217b058116bb54ab57b818f52c0beafc4d086252c65bbcf29eb50d43868b486a08a4fc883bd5066efb428ebaf673f5aee3fa618751a05f68
638-
: 1: 62fefb97b4e5f74a95ff8c7b0c0074112c2d585df432ba5172b47b866b9c85a912833da9da0429f00c98aa495dd31a9e3d53bb72d99a1581d61cc17195daa767c8a48cbe2a2a11f581342c17c709c91dc4715944e1757e7e3913cccb29a6ece9f96380459ea36f4464e534c848fa82b776135719138ff4e9a28e599629b8d60f8306e86f666b1fd70cdd1318f11d7e02498dc6a243dcd63e47c5cb6b8bbd3fc3c7ca9b2ab2
639-
: 2: c379190dad54620fc4b63b315be4b21a32a7f4792ab1d02c190b43e108f734d4e6cdb7f1dd7856a1fda4b7dfd2ab2a97b42c9859d651bd32644345dd06a5c3b8e6df287ba291449a167e332206f358aaac77d7f7c90c465a0f128becce593ca8158d62cad350865a4c59838cc843245242fa2925c9646c8d399c75bc7af390bcf62a3feb44b013eb3cbb64c6fc66e5a3aeeb053fb15b265cd01806b6f2f59e9fa7e33b27f9
640-
: 3: 3b93e5728bb41a096ef3ad1feb62372fefdb173776af78288b2f7429baa323acc65c2bf5032f7f47007a3c5ded7cd3a2378314d5244bc0db220d3fdd1118c006dbb94e2409a89d876da0423f93a619605b07997d82e839af34171cdc335850c34a1115f900500c3df595f2a18df53f0150bf9e3b5307c4f17d1d2c2effe0db99077e66e172f3972168e5d9df4408ae1195d74ca72c0fd7ca2761236d2327496a4a4a911316
635+
: nonce: 312721ad5a6548f417582da22c26ea12a825f9ccde985b1c0fdfa701
636+
: 0: 9b4e012dc146c0b8616c2869df990c4ebe93df67069c27a8a1f73c6a53481ef2ca1089342986649fccff8a5fa61fc7dd4acfb96d73f8eec963692199fc0d0ccd9b215950d33133eb465504ee98cdfe90df3c231698554fc514bbf0ade9c715707b3d8e447c103c415469da56582c3b3f56c0315ba36f8854d0286371c43a292c0f6fd4e9c1d5e820f1b20105f67368662b678c3f391dddaed4c31939fa7e9b90a0ecd3e486
637+
: 1: e3a37429a444fe0ee868c4f2b1bc6306c2906524b75581fdfec4fac9a756b3a67b487f96f5c667362fbbc6bde04623c2a91b186187784315df31bb612feb0b07a9b0ca5ea67a1b0786611f455f0049b0444c76f9afb5ee3889a2e6b088bb4569531bbeb414b4a4de8106c6e0531f32222e780dbec17b314c2632ab749e54cb05dfe4bbfa559980d03e68f63ac8d33f0eafc977363b006bba5a52468002107026320f4dad3b
638+
: 2: f2acf29d52a388859cc673cf2e31de35ca84818807a6c5acf6a1102fecab7aba0f737ac4fbf97cfe2be06f0a5f890081f138136ac213cd200b34691146b331f4f0e01c3aac3f6623efb311b79b1800e195ec9733dfe403f018696b430122a1aff08f7990838e499b22468b776c01319b760b50e73cd28bf306ee89acd06474e3a20b262f834511f503521e84df1fa262e46543d130f32dd01006d7e3da55916c7469e99a5b
639+
: 3: ff557d463a30cb1917985b5b932999e7af43011ce2929250c8eb53dbc9e365b991cfbd664b726d699c494be4346d9bcf44813b1f889388e86dc8677ba308264f8d0d25dcb38d36f6828480e0fc6df8ba20783602566dd9908f4f7c574c50f9dc63c01a9efe6b17f8d1d3ba87aa9fb07e9b8851b5ab908708ce3235de20a1641d527290fcaf3b96776d17b838c57db707ca204124f6e4aa67de88d37f5bd3b5283781f7867d
641640
#+LATEX: }
642641

643642
On the receiving computer, we can decrypt and recover the stream of accounts from the wallet
@@ -682,12 +681,13 @@ wallet.
682681
Outputs a =slip39.Details= namedtuple containing:
683682

684683
#+LATEX: {\scriptsize
685-
| Key | Description |
686-
|-----------------+---------------------------------------------------|
687-
| name | (same) |
688-
| group_threshold | (same) |
689-
| groups | Like groups, w/ <members> = ["<mnemonics>", ...] |
690-
| accounts | Resultant list of groups of accounts |
684+
| Key | Description |
685+
|-----------------+----------------------------------------------------|
686+
| name | (same) |
687+
| group_threshold | (same) |
688+
| groups | Like groups, w/ <members> = ["<mnemonics>", ...] |
689+
| accounts | Resultant list of groups of accounts |
690+
| using_bip39 | Seed produced from entropy using BIP-39 generation |
691691
#+LATEX: }
692692

693693
This is immediately usable to pass to =slip39.output=.
@@ -790,14 +790,17 @@ wallet.
790790
*** =slip39.produce_pdf=
791791

792792
#+LATEX: {\scriptsize
793-
| Key | Description |
794-
|-----------------+---------------------------------------------------|
795-
| name | (same as =slip39.create=) |
796-
| group_threshold | (same as =slip39.create=) |
797-
| groups | Like groups, w/ <members> = ["<mnemonics>", ...] |
798-
| accounts | Resultant { "path": Account, ...} |
799-
| card_format | 'index', '(<h>,<w>),<margin>', ... |
800-
| paper_format | 'Letter', ... |
793+
| Key | Description |
794+
|-----------------+---------------------------------------------------------------------|
795+
| name | (same as =slip39.create=) |
796+
| group_threshold | (same as =slip39.create=) |
797+
| groups | Like groups, w/ <members> = ["<mnemonics>", ...] |
798+
| accounts | Resultant { "path": Account, ...} |
799+
| using_bip39 | Generate Seed from Entropy via BIP-39 generation algorithm |
800+
| card_format | 'index', '(<h>,<w>),<margin>', ... |
801+
| paper_format | 'Letter', ... |
802+
| orientation | Force an orientation (default: portrait, landscape) |
803+
| cover_text | Produce a cover page w/ the text (and BIP-39 Phrase if using_bip39) |
801804
#+LATEX: }
802805

803806
Layout and produce a PDF containing all the SLIP-39 details on cards for the crypto accounts, on
@@ -837,6 +840,7 @@ wallet.
837840
| names | A sequence of Seed names, or a dict of { name: <details> } (from slip39.create) |
838841
| master_secret | A Seed secret (only appropriate if exactly one name supplied) |
839842
| passphrase | A SLIP-39 passphrase (not Trezor compatible; use "hidden wallet" phrase on device instead) |
843+
| using_bip39 | Generate Seed from Entropy via BIP-39 generation algorithm |
840844
| group | A dict of {"<group>":(<required>, <members>), ...} |
841845
| group_threshold | How many groups are required to recover the Seed |
842846
| cryptocurrency | A sequence of [ "<crypto>", "<crypto>:<derivation>", ... ] w/ optional ranges |
@@ -851,6 +855,8 @@ wallet.
851855
| wallet_pwd | If password supplied, produces encrypted BIP-38 or JSON Paper Wallets to PDF (preferred vs. json_pwd) |
852856
| wallet_pwd_hint | An optional passphrase hint, printed on paper wallet |
853857
| wallet_format | Paper wallet size, (eg. "third"); the default is 1/3 letter size |
858+
| wallet_paper | Other paper format (default: Letter) |
859+
| cover_page | A bool indicating whether to produce a cover page (default: True) |
854860
#+LATEX: }
855861

856862
For each of the names provided, produces a separate PDF containing all the SLIP-39 details and
@@ -955,11 +961,17 @@ wallet.
955961

956962
** BIP-39 vs. SLIP-39 Incompatibility
957963

958-
Unfortunately, it is *not possible* to cleanly convert a BIP-39 generated wallet Seed into a
964+
Unfortunately, it is *not possible* to cleanly convert a BIP-39 /generated/ wallet Seed into a
959965
SLIP-39 wallet. Both BIP-39 and SLIP-39 preserve the original 128- to 256-bit Seed Entropy
960966
(random) bits, but these bits are used *very differently* -- and incompatibly -- to generate the
961967
resultant wallet Seed.
962968

969+
In native SLIP-39, the original, recovered Seed Entropy (128- or 256-bits) is used directly by
970+
the BIP-44 wallet derivation. In BIP-39, the Seed entropy is not directly used /at all/! It is
971+
only *indirectly* used; the BIP-39 Seed Phrase (which contains the exact, original entropy) is
972+
used, as normalized text, as input to a hashing function, along with some other fixed text, to
973+
produce a 512-bit Seed, which is then fed into the BIP-44 wallet derivation process.
974+
963975
The least desirable method is to preserve the 512-bit *output* of the BIP-39 mnemonic phrase as a
964976
set of 512-bit (59-word) SLIP-39 Mnemonics. But first, lets review how BIP-39 works.
965977

@@ -1115,7 +1127,7 @@ wallet.
11151127

11161128
#+LATEX: {\scriptsize
11171129
#+BEGIN_SRC ipython :session :exports both :results raw drawer
1118-
name,thrs,grps,acct = slip39.create(
1130+
name,thrs,grps,acct,ub39 = slip39.create(
11191131
"Test", 2, { "Mine": (1,1), "Fam": (2,3) }, entropy )
11201132
[
11211133
[ f"{g_name}({g_of}/{len(g_mnems)}) #{g_n+1}:" if l_n == 0 else "" ] + words
@@ -1283,15 +1295,15 @@ wallet.
12831295

12841296
*** Emergency Recovery: Using Recovered Paper Wallets
12851297

1286-
There is one approach which can preserve an original BIP-39 generated wallet addresses, using
1298+
There is one approach which can preserve an original BIP-39 /generated/ wallet addresses, using
12871299
SLIP-39 mnemonics.
12881300

12891301
It is clumsy, as it preserves the BIP-39 *output* 512-bit stretched seed, and the resultant
12901302
59-word SLIP-39 mnemonics cannot be used (at present) with the Trezor hardware wallet. They
12911303
can, however, be used to recover the HD wallet private keys without access to the original
12921304
BIP-39 Mnemonic phrase /or passphrase/ -- you could generate and distribute a set of more secure
1293-
SLIP-39 Mnemonic phrases, instead of trying to secure the original BIP-39 mnemonic -- without
1294-
abandoning your BIP-39 wallets.
1305+
SLIP-39 Mnemonic phrases, instead of trying to secure the original BIP-39 mnemonic + passphrase
1306+
-- without abandoning your existing BIP-39 wallets.
12951307

12961308
We'll use =slip39.recovery --bip39 ...= to recover the 512-bit stretched seed from BIP-39:
12971309

@@ -1360,8 +1372,9 @@ wallet.
13601372

13611373
*** Best Recovery: Using Recovered BIP-39 Mnemonic Phrase
13621374

1363-
The best solution is to use SLIP-39 to back up the original BIP-39 Seed Entropy, and then later
1364-
recover that Seed Entropy and re-generate the BIP-39 Mnemonic phrase:
1375+
The best solution is to use SLIP-39 to back up the original BIP-39 Seed /Entropy/ (/not/ the
1376+
generated Seed), and then later recover that Seed Entropy and re-generate the BIP-39 Mnemonic
1377+
phrase. You will continue to need to remember and use your original BIP-39 passphrase:
13651378

13661379
#+BEGIN_SRC mermaid :file images/BIP-39-backup-entropy.png
13671380
sequenceDiagram

README.pdf

1015 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)