QString DataProcessing::RC4(QString in, QString key, bool isJM)
{
QByteArray inByte;
if (isJM == true)
{
inByte = in.toUtf8().toBase64();
}
else
{
inByte = QByteArray::fromBase64(in.toLatin1());
}
int inLen = inByte.length();
unsigned char* sequence;
QByteArray inC = inByte;
sequence = (unsigned char *)inC.data();
int keyLen = key.length();
QByteArray keyC = key.toLatin1();
unsigned char* cKey;
cKey = (unsigned char*)keyC.data();
QByteArray out = "";
//Init Sbox
unsigned char SBox[128], Key[128];
int i, k, j = 0, t;
unsigned char temp, r;
for (i = 0; i < 128; i++)
SBox[i] = i;
for (k = i = 0; i < 128; i++)
{
Key[i] = cKey[k];
k = (k + 1) % keyLen;
}
for (i = 0; i < 128; i++)
{
j = (j + SBox[i] + Key[i]) % 128;
temp = SBox[i];
SBox[i] = SBox[j];
SBox[j] = temp;
}
//RC4 Cipher
i = 0;
j = 0;
for (k = 0; k < inLen; k++)
{
r = sequence[k];
i = (i + 1) % 128;
j = (j + SBox[i]) % 128;
temp = SBox[i];
SBox[i] = SBox[j];
SBox[j] = temp;
t = (SBox[i] + SBox[j]) % 128;
r = r ^ SBox[t];
//out += QString::number(r, 16);
out.append(QString(QChar(r)).toLatin1());
//char rr = char(r);
//out += QString::fromUtf8(&rr);
}
QString Result;
if (isJM == false)
{
Result = QString::fromUtf8(QByteArray::fromBase64(out));
}
else
{
Result = out.toBase64();
}
return Result;
}