def decodeWithReedSolo(encodedata): if len(encodedata) > 255: return b'', False, 255 # print(encodedata) # if len(encodedata) > 255: # c = math.ceil(len(encodedata) / 2) # print(c) # if c > 255: # c = 255 # byte2, check2, err2 = decodeWithReedSolo(encodedata[c:]) # byte1, check1, err1 = decodeWithReedSolo(encodedata[:c]) # if (check2[0] and check1[0]): # print(check2) # return byte1 + byte2, check1, err1 + err2 # else: # ecc_len = math.ceil(len(encodedata) / (1+errorPercent) * errorPercent) # return b'', False, ecc_len // 2 + 1 ecc_len = math.ceil(len(encodedata) / (1 + errorPercent) * errorPercent) # print(ecc_len) rsc = RSCodec(math.ceil(ecc_len)) check = rsc.check(encodedata) try: decoded_msg, decoded_msgecc, errata_pos = rsc.decode(encodedata) check = rsc.check(decoded_msgecc) return decoded_msg, check, len(errata_pos) except: return b'', check, ecc_len // 2 + 1
def decrypt(self, data: bytes, hashalg=SHA256): broken = False try: bb = self._unhead(data[:_header_size]) except: print(data) return b'\x00', True _rrs = RSCodec(_check) dd = data[_header_size:bb * 255 + _header_size] if self.debug: print(_rrs.check(dd)) kd = b'' for i in range(bb): try: kd += _rrs.decode(dd[i * 255:(i + 1) * 255])[0] except: kd += dd[i * 255:(i + 1) * 255 - _check] broken = True try: dd = unpad(kd, _rsc_block) except: dd = kd[:-kd[-1]] broken = True if self.mode == MODE_AES: dd = self._aes_dec(dd) else: dd = dd try: dd = unpad(dd, self.block_size) except: dd = dd[:-dd[-1]] broken = True if self.verify: sz = self.key.size_in_bytes() dd, sig = dd[:-sz], dd[-sz:] hs = hashalg.new(dd) try: pkcs1_15.new(self.key).verify(hs, sig) except: print('signature not valid') if broken: print('data may be broken during the process') return dd, broken