2015-06-20 106 views
-1

如何在不超過帶有大文件的系統RAM的情況下輸入TEA cipher? 我已經嘗試過這樣做,但它已經結束了大規模的失敗和小時的修補,導致什麼都沒有。那麼有人能給我一個例子說明如何做到這一點,或者有關如何做到這一點的任何有意義的信息?在沒有淹沒RAM的情況下輸入TEA密碼

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 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 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 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; 
} 

回答

-1

這固定了它。

void readSystem(string fname,string outFileName,string key,string mode) 
{ 
    //size_t buffer_size = 1<<20; 
    size_t buffer_size; 
    if(mode == "E") 
    { 
     buffer_size = 32; 
    } 
    else 
    { 
     buffer_size = 36; 
    } 
    //char *buffer = new char[buffer_size]; 
    string buffer(buffer_size,'\0'); 
    string data,output; 

    //data.resize(buffer_size); 

    // The input 
    std::ifstream fin(fname,ios::binary); 
    // The output 
    ofstream outFile(outFileName,ios::binary);// | ios::app); 

    // Anti overwrite 
    if(getSize(outFileName) > 0) 
    { 
     cout << "Overwrite error" << endl; 
     exit(0); 
    } 

    while (fin) 
    { 
     // Try to read next chunk of data 
    // fin.read(buffer, buffer_size); 
     fin.read(&buffer.front(), buffer_size); 
     // Get the number of bytes actually read 
     size_t count = fin.gcount(); 
     data = buffer; 

     //data = encode(data,key); 

     if(mode == "E") 
     { 
      data = encode(data,key); 
     } 
     if(mode == "D") 
     { 
      data = decode(data,key); 
     } 

     //blockXor(data,key); 
     //outFile.write(data.c_str(),count); 
     outFile.write(data.c_str(),data.length());  
     // If nothing has been read, break 

     if (!count) 
      break;  
     // Do whatever you need with first count bytes in the buffer 
    } 
    outFile.close(); 
    fin.close(); 
// delete[] buffer; 

} 
+0

如果您要回答自己的問題,您可能會指出兩組代碼之間的區別以及原因。有人不應該需要區分他們來弄清楚。 –

相關問題