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