// MD5 Padding
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
// Converts a decimal number to an 8-bit binary string
string decToBinary8(int n) {
return bitset<8>(n).to_string();
}
// Converts a 64-bit integer to little-endian byte-wise binary strings
vector<string> lengthTo64BitLittleEndian(uint64_t bitLength) {
vector<string> res;
for (int i = 0; i < 8; i++) {
res.push_back(decToBinary8(bitLength & 0xFF)); // Get the least significant byte
bitLength >>= 8; // Shift right by 8 bits
}
return res;
}
int main() {
string inp;
cout << "Give the original message to check: ";
getline(cin, inp);
vector<string> inputChain;
cout << "\n1. Original message in binary:\n";
for (char c : inp) {
string binChar = decToBinary8((int)c);
inputChain.push_back(binChar);
cout << binChar << " ";
}
int originalBits = inp.size() * 8;
cout << "\n\n2. Total message length in bits: " << originalBits << endl;
// Padding starts with '1' bit followed by '0's
vector<string> paddingChain;
paddingChain.push_back("10000000"); // First '1' bit (0x80)
// Calculate padding length: make total (message + padding) ≡ 448 mod 512
int totalBitsBeforeLength = originalBits + 8; // +8 for the initial 0x80 byte
int paddingBitsNeeded = (448 - totalBitsBeforeLength % 512 + 512) % 512;
int paddingBytes = paddingBitsNeeded / 8;
for (int i = 0; i < paddingBytes; i++) {
paddingChain.push_back("00000000");
}
cout << "\n3. Padding bytes (including 0x80): " << paddingChain.size() << endl;
cout << "Padding in binary:\n";
for (string p : paddingChain) {
cout << p << " ";
}
// Message length in 64-bit little-endian format
vector<string> lengthChain = lengthTo64BitLittleEndian(originalBits);
cout << "\n\n4. 64-bit message length in little-endian binary:\n";
for (string l : lengthChain) {
cout << l << " ";
}
// Combine everything
cout << "\n\n5. Final message in binary (message + padding + length):\n";
for (string s : inputChain) cout << s << " ";
for (string s : paddingChain) cout << s << " ";
for (string s : lengthChain) cout << s << " ";
cout << "\n\nTotal final size in bits: " << inputChain.size()*8 + paddingChain.size()*8 + 64 << endl;
return 0;
}