QR SafeShare converts each BIP-39 word into its 11-bit index and then packs all indices into a continuous bitstream that matches the original BIP-39 binary layout of entropy plus checksum bits. This packed byte array becomes the secret that is shared using true k-of-n Shamir Secret Sharing, implemented with secrets.js over GF(2⁸) and random coefficients generated by WebCrypto (CSPRNG).
Using Shamir also means there is no single point of failure. For example, in a 3-of-2 setup (n=3, k=2), the recovery phrase is divided into three independent fragments, and any two of them are enough to restore it. If one share is lost, destroyed, or stolen, the other two can still recover the wallet, while a single stolen share alone reveals nothing. This design adds redundancy without introducing new risks, protecting against both loss and theft at the same time.
For a 2-of-2 setup the app switches to a simple XOR split, which provides the same level of security for that case while keeping the QR codes much smaller and easier to handle. When the shares are combined, the app reconstructs the byte array, unpacks the 11-bit indices, and converts them back into the original words. Nothing human-readable is ever split; only the binary form of the mnemonic is used.
In theory a “poisoned” share could be crafted, but without access to the other shares it is practically impossible to make it reconstruct a valid-looking seed. I decided not to include verifiable secret sharing or per-share commitments in the current version because those would greatly increase share size and QR complexity, making the fragments less practical. Checksum validation can be added to detect corrupted or tampered reconstructions, but it is not yet enforced in this release.
