diff options
Diffstat (limited to 'src/crypt')
| -rw-r--r-- | src/crypt/cryptclassrc4.cpp | 4 | ||||
| -rw-r--r-- | src/crypt/cryptrc4.cpp | 48 | ||||
| -rw-r--r-- | src/crypt/cryptrc4.h | 3 |
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; }; |
