Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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