Esempio n. 1
0
    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