IntroductionI recently decided to stamp my seed phrases onto stainless steel blanks for preservation. I wanted to preserve and secure the seed phrases for multiple wallets, including the ones I've created for each of my children. I didn't want to spend all day stamping letters into stainless, and for security purposes I didn't want the actual seed words stamped on the metal. The spreadsheet I've created below gives me a tool to resolve both issues.
BackgroundBIP39 Seed Phrases are utilized by many hardware, desktop, and mobile-app wallets and their respective software. They are not only used for Bitcoin, but many other coins as well. There are even some web wallets that utilize BIP39 seed phrases for backup and recovery. The phrases are most often 12 words in a string, but can be longer. The words, and the order in which they are generated is critical information and represents the core backup of an HD wallet, and all its Private Keys. You'll need the seed phrase to restore the wallet in case the hardware on which it resides is lost, stolen, or otherwise compromised. With the seed phrase you can restore the wallet onto multiple devices. In the case of cold wallets you may choose to not have the private key reside on any electronic device.
The IssueThe seed words themselves may be several characters long, and may be in an order that is easy to remember. From the practical perspective, I didn't want to spend a lot of time stamping hundreds of characters into steel. While wanting to secure many wallets it was looking like I would have to dedicate a lot of time stamping seed phrases into the steel blanks.
The security issue of having the seed phrases stamped onto a piece of steel that some one might see was also something that concerned me. Even with the steel locked in secure storage such as a safe, the potential for someone to see them does exist. Someone with a quick eye and a keen memory could theoretically see the phrase and remember it, and then proceed to steal the funds.
SolutionIt occurred to me that encoding the phrases could resolve both of my concerns. I choose to use the numeric value of the list position of the BIP39 word and then encode the numeric value to HEX code format. This method compresses the information to three characters per word, and by converting the seed phrase into a format that is not immediately recognizable to most, makes the character string harder to remember.
Although this encoding method does not encrypt the information, it can be combined with encryption techniques for added security. A simple or complex seed number shift can easily be added to the tool outlined below. That will be covered by another post.
Build the SpreadsheetSecuritySince you will be typing your secret seed words into the spreadsheet, I suggest building the spreadsheet on an air-gapped computer, or one that you are 100% confident is not infected with a virus, malware, or a key-logger. Your security is your responsibility, do not skimp.
Sheet 1; BIP39 Word ListOnline Computer:
- Browse to GitHub and download the Bip39 word list in your preferred language.
- Copy the list onto a clean USB drive for transfer to the offline computer.
Offline Computer:
- Start a spreadsheet, and name the first sheet "BIP39 Word List" (the name of this sheet is critical for the functionality of the formula.)
- Copy the 2048 words from the word list you've chosen, and paste the words into a single column in the sheet titled "BIP39 Word List."
Sheet 2; Encoding- Create another sheet and name it "Encode" (the name of this sheet is not critical.)
- In the first row, apply names to the columns as a reference (see example below.)
- In my example I've named column A "Seed Words," and column B "Hex Code."
- Type or paste your seed words into column A, typing one word per cell (see example below.)
- Copy the formula code below and past it into cell B2.
- Drag the formula down through all the cells you want to convert.
=DEC2HEX(MATCH(A2, 'BIP39 Word List'!$A:$A, 0)+ROW('BIP39 Word List'!$A:$A)-1, 3)
Sheet 3; Decoding- Create a third sheet and name it "Decode" (the name of this sheet is not critical.)
- In the first row, apply names to the columns as a reference (see example below.)
- In my example I've named column A "Hex Code," and column B "Seed Words."
- Type or paste your Hex Code in column A, typing one code per cell (see example below.)
- Copy the formula code below and past it into cell B2.
- Drag the formula down through all the cells you want to convert.
=INDIRECT("'BIP39 Word List'!A"&HEX2DEC(A2)+0)
Spreadsheet ToolI have made my sample spread sheet available for viewing and downloading. Editing the spreadsheet has been disabled. It has an unfunded TestNet seed phrase as an example. I suggest you use the formulas above to build your own, and use it on an air-gapped device.
The Spreadsheet link is here, if you need to download it.