馈送TEA密码而不淹没柱塞

Feeding the TEA Cipher without flooding ram

本文关键字:淹没 TEA 密码 馈送      更新时间:2023-10-16

如何在不超过具有大文件的系统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;
}

这修复了它。

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,'');
    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;
}