thenuke321

tea.cpp

Nov 28th, 2014
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <cstdlib>
  4. #include <ctime>
  5. #include <fstream>
  6. #include <cstddef>
  7. #include <vector>
  8. #include <map>
  9. #include <stdint.h>
  10. #include "SString.h"
  11. #include <stdarg.h>
  12. using namespace std;
  13.  
  14.  
  15.  
  16.     void encodeXtea(unsigned int* v, unsigned int* w, unsigned int* k) {
  17.         register unsigned int v0=v[0], v1=v[1], i, sum=0;
  18.         register unsigned int delta=0x9E3779B9;
  19.         for(i=0; i<32; i++) {
  20.            v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
  21.             sum += delta;
  22.             v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
  23.         }
  24.         w[0]=v0; w[1]=v1;
  25.     }
  26.  
  27.     void decodeXtea(unsigned int* v, unsigned int* w, unsigned int* k) {
  28.         register unsigned int v0=v[0], v1=v[1], i, sum=0xC6EF3720;
  29.         register unsigned int delta=0x9E3779B9;
  30.         for(i=0; i<32; i++) {
  31.             v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
  32.             sum -= delta;
  33.             v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
  34.         }
  35.         w[0]=v0; w[1]=v1;
  36.     }
  37.  
  38.     void TeaEncode ( const SString& str, const SString& key, SString* out )
  39.     {
  40.         unsigned int v[2];
  41.         unsigned int w[2];
  42.         unsigned int k[4];
  43.         unsigned int keybuffer [ 4 ];
  44.  
  45.         // Clear buffers
  46.         memset ( v, 0, sizeof(v) );
  47.         memset ( w, 0, sizeof(w) );
  48.         memset ( k, 0, sizeof(k) );
  49.         memset ( keybuffer, 0, sizeof(keybuffer) );
  50.         out->clear ();
  51.  
  52.         // Process the key
  53.         int len = key.length ();
  54.         if ( len > 16 )
  55.             len = 16;
  56.         memcpy ( keybuffer, key.c_str(), len );
  57.         for ( int i = 0; i < 4; ++i )
  58.             k[i] = keybuffer[i];
  59.  
  60.         // Copy the input string to a buffer of size multiple of 4
  61.         int strbuflen = str.length ();
  62.         if ( strbuflen == 0 )
  63.             return;
  64.         if ( (strbuflen % 4) > 0 )
  65.             strbuflen += 4 - (strbuflen % 4);
  66.         unsigned char* strbuf = new unsigned char [ strbuflen ];
  67.         memset ( strbuf, 0, strbuflen );
  68.         memcpy ( strbuf, str.c_str(), str.length() );
  69.  
  70.         // Encode it!
  71.         v[1] = 0;
  72.         for ( int i = 0; i < strbuflen; i += 4 )
  73.         {
  74.             v[0] = *(unsigned int*)&strbuf[i];
  75.  
  76.             encodeXtea ( &v[0], &w[0], &k[0] );
  77.             out->append ( (char*)&w[0], 4 );
  78.  
  79.             v[1] = w[1];
  80.         }
  81.         out->append ( (char*)&v[1], 4 );
  82.  
  83.         delete [] strbuf;
  84.     }
  85.  
  86.     void TeaDecode ( const SString& str, const SString& key, SString* out )
  87.     {
  88.         unsigned int v[2];
  89.         unsigned int w[2];
  90.         unsigned int k[4];
  91.         unsigned int keybuffer [ 4 ];
  92.  
  93.         // Clear buffers
  94.         memset ( v, 0, sizeof(v) );
  95.         memset ( w, 0, sizeof(w) );
  96.         memset ( k, 0, sizeof(k) );
  97.         memset ( keybuffer, 0, sizeof(keybuffer) );
  98.         out->clear ();
  99.  
  100.         // Count the number of passes that we need
  101.         int numBlocks = str.length() / 4;
  102.         int numPasses = numBlocks - 1;
  103.  
  104.         if ( numPasses <= 0 )
  105.             return;
  106.  
  107.         // Process the key
  108.         int len = key.length ();
  109.         if ( len > 16 )
  110.             len = 16;
  111.         memcpy ( keybuffer, key.c_str(), len );
  112.         for ( int i = 0; i < 4; ++i )
  113.             k[i] = keybuffer[i];
  114.  
  115.         // Create a temporary buffer to store the result
  116.         unsigned char* buffer = new unsigned char [ numPasses * 4 + 4 ];
  117.         memset ( buffer, 0, numPasses * 4 + 4 );
  118.  
  119.         // Decode it!
  120.         const char* p = str.c_str();
  121.         v[1] = *(unsigned int*)&p[numPasses * 4];
  122.         for ( int i = 0; i < numPasses; ++i )
  123.         {
  124.             v[0] = *(unsigned int*)&p[(numPasses-i-1)*4];
  125.             decodeXtea ( &v[0], &w[0], &k[0] );
  126.             *(unsigned int*)&buffer[(numPasses-i-1)*4] = w[0];
  127.             v[1] = w[1];
  128.         }
  129.  
  130.         out->assign ( (char *)buffer, numPasses*4 );
  131.         delete [] buffer;
  132.     }
  133.  
  134. int main ()
  135. {
  136.  
  137. }
Advertisement
Add Comment
Please, Sign In to add comment