ultimatepp/bazaar/StreamCypher/RC4.cpp
micio b23908dff1 Bazaar/StreamCypher : added a couple of class for stream data encoding/decoding
git-svn-id: svn://ultimatepp.org/upp/trunk@2726 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2010-09-29 17:40:12 +00:00

90 lines
1.3 KiB
C++

#include "RC4.h"
NAMESPACE_UPP
RC4::RC4()
{
memset(sbox, 0, 256);
si = sj = 0;
}
RC4::RC4(String const &key)
{
SetKey(key);
}
RC4::RC4(byte const *keyBuf, int keyLen)
{
SetKey(keyBuf, keyLen);
}
bool RC4::SetKey(String const &key)
{
byte const *b = (byte const *)~key;
int keyLen = key.GetCount();
return SetKey(b, keyLen);
}
bool RC4::SetKey(byte const *keyBuf, int keyLen)
{
int i, j;
unsigned char keyarr[256], swap;
si = sj = 0;
for (i = j = 0; i < 256; i++, j = (j + 1) % keyLen)
{
sbox[i] = i;
keyarr[i] = keyBuf[j];
}
for (i = j = 0; i < 256; i++)
{
j += sbox[i] + keyarr[i];
j %= 256;
swap = sbox[i];
sbox[i] = sbox[j];
sbox[j] = swap;
}
return true;
}
void RC4::Encode(const byte *src, byte *dst, size_t len)
{
unsigned char swap;
while (len--)
{
sj += sbox[++si];
swap = sbox[si];
sbox[si] = sbox[sj];
sbox[sj] = swap;
swap = sbox[si] + sbox[sj];
*dst++ = *src++ ^ sbox[swap];
}
}
void RC4::Encode(byte *buf, size_t len)
{
Encode(buf, buf, len);
}
String RC4::Encode(String const &s)
{
unsigned char swap;
int i = 0;
int len = s.GetCount();
String res;
while (len--)
{
sj += sbox[++si];
swap = sbox[si];
sbox[si] = sbox[sj];
sbox[sj] = swap;
swap = sbox[si] + sbox[sj];
res += s[i++] ^ sbox[swap];
}
return res;
}
END_UPP_NAMESPACE;