[NO-PARSE]#include <iostream> // std::cout, std::endl
#include <vector> // std::vector
#include <algorithm> // std::copy, std::generate_n
#include <iterator> // std::ostream_iterator
#include <random> // std::mt19937
typedef unsigned char byte;
void GenerateShiftKey(std::vector<byte> &input_bytes, const unsigned key_len, const unsigned seed)
{
std::mt19937 rand_generator(seed); // mt19937 - mersenne_twister_engine
std::generate_n(input_bytes.begin(), key_len, [&rand_generator]() { return rand_generator() % (0xFF + 1); });
}
int main()
{
std::vector<byte> input_data { 0x52, 0x3D, 0x44, 0x6F, 0x53, 0x53, 0x4F, 0x67, 0x67, 0x57, 0xAB };
// std::vector<byte> shift_key { 0x9E, 0x7B, 0xEF, 0xBD, 0xF7, 0xDE, 0x7B, 0xEF, 0xBD, 0xF7 };
const int key_len = input_data.size();
std::vector<byte> shift_key(key_len);
GenerateShiftKey(shift_key, key_len, 17);
std::cout << std::uppercase << std::hex;
std::cout << "shift key : ";
std::copy(shift_key.begin(), shift_key.end(), std::ostream_iterator<int>(std::cout, " "));
std::endl(std::cout);
int i = 0;
std::for_each(input_data.begin(), input_data.end(), [&i, &shift_key, &input_data](byte b) {
input_data = ((b & 0xF) * (0xF + 1)) + (b >> 4) + shift_key[i % shift_key.size()];
i++;
});
std::cout << "encrypted : ";
std::copy(input_data.begin(), input_data.end(), std::ostream_iterator<int>(std::cout, " "));
std::endl(std::cout);
i = 0;
std::for_each(input_data.begin(), input_data.end(), [&i, &shift_key, &input_data](byte b) {
b -= shift_key[i % shift_key.size()];
input_data = ((b & 0xF) * (0xF + 1)) + (b >> 4);
i++;
});
std::cout << "original : ";
std::copy(input_data.begin(), input_data.end(), std::ostream_iterator<int>(std::cout, " "));
std::endl(std::cout);
}[/NO-PARSE]