#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
// Function to embed a message into WAV audio data
void embedMessage(const std::string& inputWav, const std::string& outputWav, const std::string& message) {
std::ifstream inFile(inputWav, std::ios::binary);
if (!inFile) {
std::cerr << "Error opening input WAV file." << std::endl;
return;
}
std::ofstream outFile(outputWav, std::ios::binary);
if (!outFile) {
std::cerr << "Error opening output WAV file." << std::endl;
return;
}
// Read WAV header
std::vector<char> header(44);
inFile.read(header.data(), 44);
outFile.write(header.data(), 44);
// Prepare the message for embedding
std::string messageWithTerminator = message + '\0'; // Null-terminate the message
std::vector<char> messageBits(messageWithTerminator.begin(), messageWithTerminator.end());
// Read audio data
std::vector<char> audioData((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
inFile.close();
// Ensure the message fits into the audio data
if (messageBits.size() * 8 > audioData.size()) {
std::cerr << "Message is too long to embed in the audio file." << std::endl;
return;
}
// Embed the message bits into the audio data
for (size_t i = 0; i < messageBits.size() * 8; ++i) {
char& audioByte = audioData[i];
char messageBit = (messageBits[i / 8] >> (i % 8)) & 1;
audioByte = (audioByte & ~1) | messageBit; // Modify the least significant bit
}
// Write the modified audio data to the output file
outFile.write(audioData.data(), audioData.size());
outFile.close();
}
// Function to extract a message from WAV audio data
std::string extractMessage(const std::string& inputWav, size_t messageLength) {
std::ifstream inFile(inputWav, std::ios::binary);
if (!inFile) {
std::cerr << "Error opening input WAV file." << std::endl;
return "";
}
// Skip WAV header
inFile.seekg(44);
// Read audio data
std::vector<char> audioData((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
inFile.close();
std::vector<char> messageBits(messageLength);
for (size_t i = 0; i < messageLength * 8; ++i) {
char& audioByte = audioData[i];
char messageBit = audioByte & 1;
messageBits[i / 8] |= (messageBit << (i % 8)); // Extract the LSB
}
return std::string(messageBits.begin(), messageBits.end());
}
int main() {
std::string inputWav = "input.wav";
std::string outputWav = "output.wav";
std::string message = "Hidden Message";
embedMessage(inputWav, outputWav, message);
std::cout << "Message embedded into audio file." << std::endl;
std::string extractedMessage = extractMessage(outputWav, message.size() + 1);
std::cout << "Extracted Message: " << extractedMessage << std::endl;
return 0;
}