Skip to content

Instantly share code, notes, and snippets.

@pgmrDohan
Created September 6, 2025 08:32
Show Gist options
  • Select an option

  • Save pgmrDohan/86cf57089d66247954c69c0146cf3b0c to your computer and use it in GitHub Desktop.

Select an option

Save pgmrDohan/86cf57089d66247954c69c0146cf3b0c to your computer and use it in GitHub Desktop.
LSB-Audio-Steganography
import wave
import struct
import utils.logger as logger
logger = logger.setup(__name__)
def encode(inputFile, outputFile, secret):
try:
logger.info("Encoding starts...")
audio = wave.open(inputFile, mode="rb")
frame_bytes = bytearray(list(audio.readframes(audio.getnframes())))
logger.info(f"Secret: {secret}")
secretBit = ''.join([bin(byte).lstrip('0b').rjust(8, '0') for byte in bytes(secret, "ASCII")])
secretLenBit = ''.join([bin(byte).lstrip('0b').rjust(8, '0') for byte in struct.pack('>I', len(secretBit))])
fullBits = secretLenBit + secretBit
if len(fullBits) > len(frame_bytes):
raise ValueError("The secret message is too large to fit in the audio file.")
for i, bit in enumerate(fullBits):
frame_bytes[i] = (frame_bytes[i] & 254) | int(bit)
frame_modified = bytes(frame_bytes)
with wave.open(outputFile, 'wb') as new_audio:
new_audio.setparams(audio.getparams())
new_audio.writeframes(frame_modified)
audio.close()
logger.info(f"Successfully encoded into {outputFile}")
except Exception as e:
logger.error(f"Error during encoding: {e}")
def decode(inputFile):
try:
logger.info("Decoding starts...")
audio = wave.open(inputFile, mode='rb')
frame_bytes = bytearray(list(audio.readframes(audio.getnframes())))
length_bits = ''.join([str((frame_bytes[i] & 1)) for i in range(32)])
message_length = struct.unpack('>I', int(length_bits, 2).to_bytes(4, byteorder='big'))[0]
logger.info(f"Extracted message length: {message_length} bits")
if message_length > len(frame_bytes) * 8:
raise ValueError("The extracted message length is larger than the available audio data.")
message_bits = ''.join([str((frame_bytes[i + 32] & 1)) for i in range(message_length)])
decoded_message = ''.join(chr(int(message_bits[i:i + 8], 2)) for i in range(0, len(message_bits), 8))
logger.info(f"Successfully decoded: {decoded_message}")
audio.close()
return decoded_message
except Exception as e:
logger.error(f"Error during decoding: {e}")
return None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment