Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class stringTeaCypher
- {
- private:
- void decodeXtea(unsigned int* v, unsigned int* w, unsigned int* k) {
- register unsigned int v0=v[0], v1=v[1], i, sum=0xC6EF3720;
- register unsigned int delta=0x9E3779B9;
- for(i=0; i<32; i++) {
- v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
- sum -= delta;
- v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
- }
- w[0]=v0; w[1]=v1;
- }
- void encodeXtea(unsigned int* v, unsigned int* w, unsigned int* k) {
- register unsigned int v0=v[0], v1=v[1], i, sum=0;
- register unsigned int delta=0x9E3779B9;
- for(i=0; i<32; i++) {
- v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
- sum += delta;
- v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
- }
- w[0]=v0; w[1]=v1;
- }
- void TeaDecode ( const std::string& str, const std::string& key, std::string* out )
- {
- unsigned int v[2];
- unsigned int w[2];
- unsigned int k[4];
- unsigned int keybuffer [ 4 ];
- // Clear buffers
- memset ( v, 0, sizeof(v) );
- memset ( w, 0, sizeof(w) );
- memset ( k, 0, sizeof(k) );
- memset ( keybuffer, 0, sizeof(keybuffer) );
- out->clear ();
- // Count the number of passes that we need
- int numBlocks = str.length() / 4;
- int numPasses = numBlocks - 1;
- if ( numPasses <= 0 )
- return;
- // Process the key
- int len = key.length ();
- if ( len > 16 )
- len = 16;
- memcpy ( keybuffer, key.c_str(), len );
- for ( int i = 0; i < 4; ++i )
- k[i] = keybuffer[i];
- // Create a temporary buffer to store the result
- unsigned char* buffer = new unsigned char [ numPasses * 4 + 4 ];
- memset ( buffer, 0, numPasses * 4 + 4 );
- // Decode it!
- const char* p = str.c_str();
- v[1] = *(unsigned int*)&p[numPasses * 4];
- for ( int i = 0; i < numPasses; ++i )
- {
- v[0] = *(unsigned int*)&p[(numPasses-i-1)*4];
- decodeXtea ( &v[0], &w[0], &k[0] );
- *(unsigned int*)&buffer[(numPasses-i-1)*4] = w[0];
- v[1] = w[1];
- }
- out->assign ( (char *)buffer, numPasses*4 );
- delete [] buffer;
- }
- void TeaEncode ( const std::string& str, const std::string& key, std::string* out )
- {
- unsigned int v[2];
- unsigned int w[2];
- unsigned int k[4];
- unsigned int keybuffer [ 4 ];
- // Clear buffers
- memset ( v, 0, sizeof(v) );
- memset ( w, 0, sizeof(w) );
- memset ( k, 0, sizeof(k) );
- memset ( keybuffer, 0, sizeof(keybuffer) );
- out->clear ();
- // Process the key
- int len = key.length ();
- if ( len > 16 )
- len = 16;
- memcpy ( keybuffer, key.c_str(), len );
- for ( int i = 0; i < 4; ++i )
- k[i] = keybuffer[i];
- // Copy the input string to a buffer of size multiple of 4
- int strbuflen = str.length ();
- if ( strbuflen == 0 )
- return;
- if ( (strbuflen % 4) > 0 )
- strbuflen += 4 - (strbuflen % 4);
- unsigned char* strbuf = new unsigned char [ strbuflen ];
- memset ( strbuf, 0, strbuflen );
- memcpy ( strbuf, str.c_str(), str.length() );
- // Encode it!
- v[1] = 0;
- for ( int i = 0; i < strbuflen; i += 4 )
- {
- v[0] = *(unsigned int*)&strbuf[i];
- encodeXtea ( &v[0], &w[0], &k[0] );
- out->append ( (char*)&w[0], 4 );
- v[1] = w[1];
- }
- out->append ( (char*)&v[1], 4 );
- delete [] strbuf;
- }
- public:
- void encode(string inString,string key,string &out)
- {
- TeaEncode(inString,key,&out);
- }
- void decode(string inString,string key,string &out)
- {
- TeaDecode(inString,key,&out);
- }
- };
- // The other stuff put into a class
- class Core
- {
- private:
- string theMainBuffer;
- vector <string> ram;
- long int encodeSize,decodeSize,bufferSize;
- string mode;
- string key;
- size_t count;
- int getSizeOfString(string theString)
- {
- return theString.length();
- }
- void cores(int rRam)
- {
- string ramTemp("");
- //stringAesCypher Code;
- stringTeaCypher Code;
- if(mode == "E")
- {
- Code.encode(ram[rRam],key,ramTemp);
- }
- if(mode == "D")
- {
- Code.decode(ram[rRam],key,ramTemp);
- }
- ram[rRam] = ramTemp;
- }
- void startCores()
- {
- thread t1(&Core::cores,this,0);
- thread t2(&Core::cores,this,1);
- thread t3(&Core::cores,this,2);
- thread t4(&Core::cores,this,3);
- thread t5(&Core::cores,this,4);
- thread t6(&Core::cores,this,5);
- thread t7(&Core::cores,this,6);
- thread t8(&Core::cores,this,7);
- t1.join();
- t2.join();
- t3.join();
- t4.join();
- t5.join();
- t6.join();
- t7.join();
- t8.join();
- }
- vector<std::string> splitBreak(const std::string& str)
- {
- for(int i = 0; i != 8; i++){ram[i] = "";}
- std::size_t n = 8;
- if( n < 2 ) return { str } ;
- std::vector<std::string> fragments;
- const auto min_sz = str.size() / n ;
- const auto excess_chars = str.size() % n ;
- const auto max_sz = min_sz + 1 ;
- // the first excess_chars fragments have one character more
- for( std::size_t i = 0 ; i < excess_chars ; ++i ) fragments.push_back( str.substr( i*max_sz, max_sz ) ) ;
- for( std::size_t i = excess_chars ; i < n ; ++i ) fragments.push_back( str.substr( excess_chars + i*min_sz, min_sz ) ) ;
- return fragments ;
- }
- void unsplitData()
- {
- theMainBuffer = "";
- for(int i = 0; i != 8; i++)
- {
- theMainBuffer.append(ram[i]);
- ram[i] = "";
- }
- }
- public:
- Core();
- void setMode(string theMode)
- {
- mode = theMode;
- }
- void setKey(string theKey)
- {
- key = theKey;
- }
- void readFile(string inputFileName,string outputFileName)
- {
- int theSize(0);
- if(mode == "E"){theSize = encodeSize;}
- if(mode == "D"){theSize = decodeSize;}
- // Size and file streams
- ifstream fileStreamIn(inputFileName,ios::binary);
- ofstream fileStreamOut(outputFileName,ios::binary);
- // The main loop
- while(fileStreamIn)
- {
- fileStreamIn.read(&theMainBuffer.front(),theSize);// Reads
- count = fileStreamIn.gcount();// Read ammount
- theMainBuffer.resize(count);
- ram = splitBreak(theMainBuffer);
- startCores();
- unsplitData();
- fileStreamOut.write(theMainBuffer.c_str(),theMainBuffer.length()); // write
- cout << "Data in flow " << count << " Data encoder outflow " << theMainBuffer.length() << endl;
- }
- fileStreamIn.close();
- fileStreamOut.close();
- }
- };
- Core::Core()
- {
- encodeSize = 256;
- decodeSize = 288;
- /*
- Tea Large
- encodeSize = 100000000;
- decodeSize = 100000032;
- */
- /*
- AES
- encodeSize = 100000000;
- decodeSize = 100000128;
- */
- //bufferSize = 100000138;
- bufferSize = 360;
- ram.resize(8);
- theMainBuffer.resize(bufferSize);
- }
Advertisement
Add Comment
Please, Sign In to add comment