2014-08-31 2 views
-4

내가이것을 뒤집는 방법?

unsigned int decrypt(unsigned char *encBuffer, unsigned int encBufferLen, unsigned char *decBuffer) 
{ 
unsigned int decBufferLen = 0; 

unsigned char table[] = { NULL, ' ', '-', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 0x0D }; 

unsigned int offset = 0, i = 0; 
unsigned char encStrLen = 0, c = 0; 

while (offset < encBufferLen) 
{ 
    if (encBuffer[offset] == 0xFFU) // if byte is 0xFF then add 0x0D to new buffer and continue 
    { 
     *(decBuffer + decBufferLen++) = 0x0D; 
     offset++; 
     continue; 
    } 

    encStrLen = encBuffer[offset++]; // get string length 

    i = 0; 
    if ((encStrLen & 0x80U) == 0) // if result is 0 then decrypt the string by Xor 33 
    { 
     while ((i++ < encStrLen) && (offset < encBufferLen)) 
     { 
      *(decBuffer + decBufferLen++) = (encBuffer[offset++]^0x33U); 
     } 
    } 
    else // otherwise 
    { 
     encStrLen &= 0x7FU; 
     while ((i < encStrLen) && (offset < encBufferLen)) 
     { 
      c = encBuffer[offset++]; // c = current byte, increment the index 
      *(decBuffer + decBufferLen++) = (table[(c & 0xF0U) >> 4]); 

      if (table[c & 0x0FU] != NULL) 
      { 
       *(decBuffer + decBufferLen++) = table[c & 0x0FU]; 
      } 

      i += 2; 
     } 
    } 
} 

return decBufferLen; 

가}

이 내가 몇 가지 테스트 후 무엇을 가지고 있습니다 ..이 암호 해독을 역전 암호화를 얻으려고 노력하지만, 할 정말 어려운거야

std::vector<unsigned char> encrypt(std::vector<unsigned char> decryptedBuf) 
{ 
    std::vector<unsigned char> vector; 

    unsigned int offset = 0, decryptedStringLength = 0; 

    unsigned char currentByte = 0; 

    while (offset < decryptedBuf.size()) 
    { 
     if (decryptedBuf[offset] == 0x0D) 
     { 
      vector.push_back(0xFF); 
      offset++; 
      continue; 
     } 

     decryptedStringLength = decryptedBuf.size() - 1; // <--- to edit if encrypt works 

     vector.push_back(decryptedStringLength); // <--- i'm not sure it will be interpreted right 

     if (decryptedStringLength < 0x80) // < '128' Xor 33 http://pastebin.com/b18JfBFK 
     { 
      for (unsigned int i = 0; i < decryptedStringLength; i++) 
       vector.push_back(decryptedBuf[offset++]^0x33); 
     } 
     else // >= '128' Table 
     { 
      decryptedStringLength -= 0x80; // & 0x7F http://pastebin.com/THZjZJfs 

      for (unsigned int i = 0; i < decryptedStringLength; i += 2) 
      { 
       currentByte = decryptedBuf[offset++]; 


      } 
     } 
    } 

    return vector; 
} 

을 가지고 그것을 되돌릴 수있는 방법에 대한 아이디어? 나는 2 일 째 노력하고 있지만 아무 것도 작동하지 않습니다.

+1

** - 1 **, 너무 많은 코드. 가능한 한 적은 코드로 게시해야합니다. – GingerPlusPlus

+0

무엇이 문제입니까? – ntoskrnl

+0

@ntoskrnl 역전사 방법에 대한 아이디어가 있습니까? – JMII89

답변

0

decrypt은 일대일이 아니므로 많은 다른 cipher 텍스트가 동일한 일반 텍스트로 해독 될 수 있습니다. 해당 "암호화"기능에 대한 가장 쉬운 접근 방법은 일반 텍스트를 127 바이트가 넘지 않는 청크로 분할하고 출력 청크 길이 뒤에 청크 XOR 0x33을 붙이는 것입니다. 이 방법은 decrypt 알고리즘의 일부만을 연습합니다. Working example

std::vector<unsigned char> encrypt(std::vector<unsigned char> decryptedBuf) { 
    vector<unsigned char> result; 

    size_t cur_offset = 0; 
    while (cur_offset < decryptedBuf.size()) { 
    unsigned char chunk_size = static_cast<unsigned char>(
     min(decryptedBuf.size() - cur_offset, size_t(0x7F))); 
    result.push_back(chunk_size); 
    result.insert(result.end(), decryptedBuf.begin() + cur_offset, 
        decryptedBuf.begin() + cur_offset + chunk_size); 

    for (vector<unsigned char>::iterator it = result.end() - chunk_size; 
     it != result.end(); ++it) { 
     *it ^= 0x33; 
    } 

    cur_offset += chunk_size; 
    } 
    return result; 
}