#include "cryptrc4.h" void swap(RC4_INT &a, RC4_INT &b) { RC4_INT tmp; tmp = a; a = b; b = tmp; } CryptRc4::CryptRc4() { } void CryptRc4::rc4SetKey(QByteArray key) { RC4_set_key(&m_rc4Key, key.length(), (const unsigned char *) key.data()); } void CryptRc4::rc4SetKeyOwn(QByteArray key) { m_rc4Key.x = 0; m_rc4Key.y = 0; for (int i = 0; i < 256; i++) { m_rc4Key.data[i] = i; } RC4_INT j = 0; for (int i = 0; i < 256; i++) { j = (j + m_rc4Key.data[i] + key[i % key.length()]) % 256; swap(m_rc4Key.data[i], m_rc4Key.data[j]); } } QByteArray CryptRc4::rc4Run(QByteArray clear) { QByteArray crypt(clear); RC4(&m_rc4Key, clear.length(), (const unsigned char *) clear.data(), (unsigned char *) crypt.data()); return crypt; } QByteArray CryptRc4::rc4RunOwn(QByteArray clear) { QByteArray crypt(clear); RC4_INT i = 0; RC4_INT j = 0; for (int k = 0; k < crypt.length(); k++) { i = (i + 1) % 256; j = (j + m_rc4Key.data[i]) % 256; swap(m_rc4Key.data[i], m_rc4Key.data[j]); crypt[k] = crypt[k] ^ m_rc4Key.data[(m_rc4Key.data[i] + m_rc4Key.data[j]) % 256]; } return crypt; }