создайте эквивалент этого файла Javascrypt на языке C

#javascript #c

Вопрос:

Я хотел отредактировать файл сохранения игры (из sheltered, игры, опубликованной team17).

К сожалению, единственный способ сделать это, файл javascrypt, хранящийся здесь, не работает (по крайней мере, часть шифрования, потому что я смог расшифровать .Файл DAT в его XML-форму…)

Может ли кто-нибудь помочь мне создать эквивалент C ?

я спрашиваю здесь, потому что я новичок в C , и у меня нет знаний о js.

Заранее спасибо.

я оставлю копию JS здесь на всякий случай…

 var resultDataBuffer;

function encrypt(buffer) {
  var encrypters = [172, 115, 254, 242, 170, 186, 109, 171, 48, 58, 139, 167, 222, 13, 21, 33, 74];
  var bytes = new Uint8Array(buffer);
  var output = "";

    for (var i = 0; i < bytes.length; i  ) {
    var oldValue = bytes[i];
    var encrypter = encrypters[i % encrypters.length];
    bytes[i] = oldValue ^ encrypter;
    output  = String.fromCharCode(bytes[i]);
  }
  
  resultDataBuffer = buffer;
  return output;
}

document.querySelector('#chooseFile').addEventListener('change', function() {
  var reader = new FileReader();
  reader.onload = function(){
    $('#result').text(encrypt(this.result));
    var blob = new Blob([resultDataBuffer], { 'type': 'application/octet-binary' });
    var objectUrl = URL.createObjectURL(blob);
    $('#downloadResult').attr('href', objectUrl);
  }
  reader.readAsArrayBuffer(this.files[0]);
}, false); 
 <input type="file" id="chooseFile"/>
<a id="downloadResult">Download Result</a>
<div id="result"></div> 

Комментарии:

1. Вы не можете интегрировать C напрямую с веб-страницами. Однако вы можете посмотреть на emscripten , он компилирует код C в WebAssembly , который поддерживается большинством популярных современных браузеров.

2. я не ищу добавления C на какую-либо веб-страницу. я просто хочу знать, как преобразовать функцию дешифрования/шифрования в C . таким образом, я могу создать автономную программу (самостоятельно), чтобы просто перетащить файл сохранения и запустить его на своем компьютере

3. Где ты на самом деле застрял? Знаете ли вы, как работают два оператора % (модуль) и ^ (побитовое XOR)?

4. % да ^ нет, я застрял в части понимания того, что происходит на стороне JS. так что я могу начать создавать эквивалент C

5. Примечание: Я не уверен, действительно ли этот зашифрованный вывод попадает в этот большой двоичный объект.

Ответ №1:

Это почти однозначный перевод:

 static uint8_t key[] = { 172, 115, 254, 242, 170, 186, 109, 171, 48, 58, 139, 167, 222, 13, 21, 33, 74 };
std::vector<uint8_t> encrypt(std::vector<uint8_t> bytes) {
  std::vector<uint8_t> output;
  int i = 0;
  for (auto b : bytes) {
    auto encrypter = key[i   % sizeof key];
    output.push_back(b ^ encrypter);
  }
  return output;
}
 

Также обратите внимание, что это шифр XOR, поэтому для дешифрования используется та же функция.

Ответ №2:

Спасибо за ваши ответы. В конце концов я получил помощь от разработчика в сообществе PS2:

 
std::string encrypt(unsigned char *buf,int size)
{
  unsigned char encrypters[17] = {172, 115, 254, 242, 170, 186, 109, 171, 48, 58, 139, 167, 222, 13, 21, 33, 74};
  std::string output;
  for( int i = 0; i < size; i  )
  {
      unsigned char oldValue = buf[i];
      unsigned char encrypter = encrypters[i % 17];
      buf[i] = oldValue ^ encrypter;
      output  = (char)buf[i];
   }
  return output;
}