summaryrefslogtreecommitdiffstats
path: root/src/crypt/cryptrc4.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypt/cryptrc4.cpp')
-rw-r--r--src/crypt/cryptrc4.cpp48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/crypt/cryptrc4.cpp b/src/crypt/cryptrc4.cpp
index 701525d..88806c8 100644
--- a/src/crypt/cryptrc4.cpp
+++ b/src/crypt/cryptrc4.cpp
@@ -1,5 +1,14 @@
#include "cryptrc4.h"
+void swap(RC4_INT &a, RC4_INT &b)
+{
+ RC4_INT tmp;
+
+ tmp = a;
+ a = b;
+ b = tmp;
+}
+
CryptRc4::CryptRc4()
{
@@ -10,10 +19,47 @@ 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(RC4_INT i = 0; i < 256; i++)
+ {
+ m_rc4Key.data[i] = i;
+ }
+ RC4_INT j = 0;
+ for(RC4_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());
+ 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;
}