in pyrit/prompt_converter/token_smuggling/sneaky_bits_smuggler_converter.py [0:0]
def decode_message(self, message: str) -> str:
"""
Decode the message encoded using Sneaky Bits mode.
The method filters out only the valid invisible characters (self.zero_char and self.one_char),
groups them into 8-bit chunks, reconstructs each byte, and finally decodes the byte sequence
using UTF-8.
Args:
message (str): The message encoded with Sneaky Bits.
Returns:
str: The decoded original message.
"""
# Filter only the valid bit characters.
bit_chars = [c for c in message if c == self.zero_char or c == self.one_char]
bit_count = len(bit_chars)
if bit_count % 8 != 0:
logger.warning("Encoded bit string length is not a multiple of 8. Ignoring incomplete trailing bits.")
bit_count -= bit_count % 8
bit_chars = bit_chars[:bit_count]
decoded_bytes = bytearray()
current_byte = 0
bits_collected = 0
for c in bit_chars:
current_byte = (current_byte << 1) | (1 if c == self.one_char else 0)
bits_collected += 1
if bits_collected == 8:
decoded_bytes.append(current_byte)
current_byte = 0
bits_collected = 0
try:
decoded_text = decoded_bytes.decode("utf-8")
except UnicodeDecodeError:
decoded_text = decoded_bytes.decode("utf-8", errors="replace")
logger.error("Decoded byte sequence is not valid UTF-8; some characters may be replaced.")
logger.info(f"Sneaky Bits decoding complete: Decoded text length is {len(decoded_text)} characters.")
return decoded_text