def decrypt(self): shares = [x.text() for x in self.textboxes if x.text()] if not shares: return hex_shares = [] for share in shares: hex_share = hex(self.mm.mnemonic_decode(share))[2:] hex_share = hex_share[0] + "-" + hex_share[2:] hex_shares.append(hex_share) decrypted = HexToHexSecretSharer.recover_secret(hex_shares) self.original.setText(self.mm.mnemonic_encode(int(decrypted, 16))) for tb in self.textboxes: tb.setText("")
def open(self, num_addr, shares, passphrase, pwd_array=None): # Rebuild the seed from shares _shares = [] x = 0 for share in shares: if pwd_array is not None: _shares.append(self.AESEncrypt(pwd_array[x], share)) else: _shares.append(share) x += 1 entropy_from_seed = HexToHexSecretSharer.recover_secret(_shares) w = self.fromEntropy(binascii.unhexlify(entropy_from_seed), passphrase) x = 0 while x < num_addr: key = w.create_address(save=True, addr_type=0) x += 1 return w
def encrypt(self): if not self.original.text(): return try: val = hex(self.mm.mnemonic_decode(self.original.text()))[2:] except ValueError: QMessageBox.question(self, 'Error', "The seed you entered is invalid.", QMessageBox.Ok, QMessageBox.Ok) return shares = HexToHexSecretSharer.split_secret( val, self.shares_required.value(), self.shares_to_generate.value()) for share_no in range(len(shares)): ssint = int(shares[share_no].replace("-", "0"), 16) ss = self.mm.mnemonic_encode(ssint) self.textboxes[share_no].setText(ss) self.original.setText("")
def create(self): if self.pwd_array is not None and (len(self.pwd_array) != self.shares): return None #Generate the seed self.seed, self.nonce = self.create_seed() entropy_from_seed = self.entropy_from_seed(self.seed, self.nonce) #Generate deposit addresses self._root = HDKey.fromEntropy(entropy_from_seed) self._primary = self._root.ChildKey(0) start_point = self._primary.ChildKey(0 + HD_HARDEN) self.deposit_addresses = {} for k in sorted(self.verwif): x = 0 addr = [] while x < self.num_addr: key = start_point.ChildKey(x) addr.append( public_key_to_address(key.PublicKey(), self.verwif[k][0])) x += 1 self.deposit_addresses.update({k: addr}) #Split the seed self.shares = HexToHexSecretSharer.split_secret( binascii.hexlify(entropy_from_seed), self.shares_required, self.num_shares) #Encrypt the shares if a pwd_array is provided #Shares are encrypte against passwords in the same order provided #This is never revealed during use if self.pwd_array is not None: self.encrypted = True x = 0 for pwd in pwd_array: self.shares[x] = self.AESEncrypt(pwd, self.shares[x]) x += 1
def recover_passphrase(shares): return HexToHexSecretSharer.recover_secret(shares)
def split_passphrase(passphrase, share_threshold=2, num_shares=6): return HexToHexSecretSharer.split_secret( passphrase, share_threshold, num_shares )
def split_passphrase(passphrase, share_threshold=2, num_shares=6): return HexToHexSecretSharer.split_secret(passphrase, share_threshold, num_shares)