thenuke321

Simple Tea

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