def set_stego_payload(self, filename: str, payload: bytes, key: str, lsb: int): max_payload = self.get_payload_size(lsb) - 8 - len( filename.encode("latin-1")) if len(payload) > max_payload: raise SteganographyException("Payload too big") if key != "": vigenere = Vigenere(Vigenere.EXTENDED, key=key.encode("utf-8")) payload = vigenere.encrypt(payload) random.seed(sum([ord(key[i]) for i in range(0, len(key), 2)])) else: random.seed(key) pixels_count = self._base_image.width * self._base_image.height seq = [i for i in range(pixels_count)] random.shuffle(seq) full_payload = pack("HHI", 0x1337, len(filename), len(payload)) full_payload += filename.encode("latin-1") full_payload += payload full_payload = BitArray(bytes=full_payload).bin len_payload = self._roundup(len(full_payload), lsb) full_payload = full_payload.ljust(len_payload, '0') i = 0 bit_mask = (1 << lsb) - 1 # make copy list pixel self._payloaded_pixel = list(self._base_image.getdata()).copy() for pos in seq: if i >= len(full_payload) / lsb: break temp_pixel = self._payloaded_pixel[pos] if type(temp_pixel) == tuple: list_pixel = [] for j in range(len(temp_pixel)): temp_each_pixel = temp_pixel[j] temp_each_pixel = self._put_bits( temp_each_pixel, bit_mask, full_payload[lsb * i:lsb * (i + 1)]) list_pixel.append(temp_each_pixel) i += 1 temp_pixel = tuple(list_pixel) else: temp_pixel = self._put_bits( temp_pixel, bit_mask, full_payload[lsb * i:lsb * (i + 1)]) i += 1 self._payloaded_pixel[pos] = temp_pixel