#pragma once #include #include #include class RC4 { public: void init(const uint8_t* key, size_t keyLen) { for (int k = 0; k < 256; ++k) S[k] = static_cast(k); uint8_t j = 0; for (int k = 0; k < 256; ++k) { j += S[k] + key[k % keyLen]; std::swap(S[k], S[j]); } i = 0; j = 0; } void process(uint8_t* data, size_t len) { for (size_t n = 0; n < len; ++n) { i += 1; j += S[i]; std::swap(S[i], S[j]); uint8_t k = S[(S[i] + S[j]) & 0xFF]; data[n] ^= k; } } private: uint8_t S[256]; uint8_t i = 0; uint8_t j = 0; };