summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Suhren <suhren.stefan@fh-swf.de>2015-05-05 15:32:05 +0200
committerStefan Suhren <suhren.stefan@fh-swf.de>2015-05-05 15:32:05 +0200
commit556b463a79594c4a90e12237d6d5212d460f41d1 (patch)
tree207e7da92f6f3bca312294aa5bdafcf55f83bec4
parenta2737677508333c18253730b46b6c368e4743eac (diff)
downloadIT-Sicherheit-556b463a79594c4a90e12237d6d5212d460f41d1.tar.gz
IT-Sicherheit-556b463a79594c4a90e12237d6d5212d460f41d1.zip
Add the best self written RC4 algo and use it for encryption
-rw-r--r--src/crypt/cryptclassrc4.cpp4
-rw-r--r--src/crypt/cryptrc4.cpp48
-rw-r--r--src/crypt/cryptrc4.h3
3 files changed, 52 insertions, 3 deletions
diff --git a/src/crypt/cryptclassrc4.cpp b/src/crypt/cryptclassrc4.cpp
index c1ab511..f530e05 100644
--- a/src/crypt/cryptclassrc4.cpp
+++ b/src/crypt/cryptclassrc4.cpp
@@ -7,8 +7,8 @@ CryptClassRc4::CryptClassRc4()
void CryptClassRc4::encrypt()
{
qDebug() << "Encrypt RC4";
- cryptClass.rc4SetKey(m_key);
- m_cryptText = cryptClass.rc4Run(m_clearText);
+ cryptClass.rc4SetKeyOwn(m_key);
+ m_cryptText = cryptClass.rc4RunOwn(m_clearText);
}
void CryptClassRc4::decrypt()
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;
}
diff --git a/src/crypt/cryptrc4.h b/src/crypt/cryptrc4.h
index 12e7c65..a73e7f4 100644
--- a/src/crypt/cryptrc4.h
+++ b/src/crypt/cryptrc4.h
@@ -11,7 +11,10 @@ public:
CryptRc4();
void rc4SetKey(QByteArray key);
+ void rc4SetKeyOwn(QByteArray key);
QByteArray rc4Run(QByteArray clear);
+ QByteArray rc4RunOwn(QByteArray clear);
+
private:
RC4_KEY m_rc4Key;
};