-1

我一直在从事 2 个项目,一个在 Game Maker 8 中制作的程序和一个在 RPG Maker XP 中制作的 RPG,我想做的一件事是让 RPG Maker XP 读取由 Game Maker 制作的“分数文件” ,乐谱文件本身只是一个基本的文本文件,Game Maker Program 和 RPG Maker XP Game 都会读取它来收集数据。

我面临的问题是,如果有人要在记事本之类的文本编辑器中打开此乐谱文件,他们可能会更改数据并“作弊”,所以我一直在尝试做的是加密文件,以便乍一看,它是不可读,让 Game Maker 和 RPG Maker XP 解密文件,从中提取所有数据,然后加密

但是我遇到了一个障碍,我在 Game Maker 中使用的 .dll 似乎以不同的方式加密/解密乐谱文件,我通过创建 2 个相同的 .txt 文件来测试 .dll,其中包含相同的文本,然后加密这两个程序,内容完全不同,这意味着如果我尝试在 RPG Maker XP 中解密在 Game Maker 中加密的文件,它将失败

我尝试过其他 .dll,但它们似乎无法在 RPG Maker XP 中工作,据我了解,RGSS 是 Ruby 的一个类,这意味着任何可以在 Ruby 中工作的代码都应该在 RPG Maker XP 以及 Ruby 和 Game 之间工作Maker 的 GML,C 是 2 可以使用 .dll 的通用语言

所以这就是我要问的,是否有任何.dll、脚本、代码等。我可以使用它来保护我的文本文件中的数据不被 Game Maker 和 RPG Maker XP 之外的编辑

特洛伊“记忆-X”记忆

PS:如果有一种方法也可以在 .php 程序中工作,那也很好,但如果不能,我可以解决这个问题

4

1 回答 1

0

XOR 是解决这个问题的一个非常简单但非常有效的解决方案。

在 GML 中:

/// script load_xor_file
// arguments: filename
// Prerequisite: Change the "key=" line to your chosen key
var key, kl, file, len, str, i;
key = "YOUR SECRET KEY HERE";
kl = string_length(key);
file = file_bin_open(argument0,0);
len = file_bin_size(file);
str = "";
for( i=0; i<l; i+=1) {
    str += chr(file_bin_read_byte(file) ^ ord(string_char_at(key,i mod kl + 1)));
}
file_bin_close(file);
return str;

/// script save_xor_file
// arguments: filename, data
// Prerequisite: Change the "key=" line to the SAME KEY as in load_xor_file
var key, kl, file, len, i;
key = "YOUR SECRET KEY HERE";
file = file_bin_open(argument0,1);
file_bin_rewrite(file);
len = string_length(argument1);
for( i=0; i<len; i+=1) {
    file_bin_write_byte(file, chr(string_char_at(argument1,i+1)) ^ chr(string_char_at(key,i mod kl + 1)));
}
file_bin_close(file);

我自己从未使用过 RPG Maker,但我想为它编写类似的代码不会太难。

几个注意事项,它不能保证安全。可以反编译 Game Maker EXE 并显示密钥,或者如果密钥不安全,则可以直接破坏密钥。

一个好的、安全的密钥很长,因为破解加密依赖于密钥自身的重复。如果密钥是被加密数据长度的一半以上,那么破解加密几乎是不可能的,除非文件的内容是可预测的(例如,我可以假设文件包含玩家的名字)和得分,所以这些可以用于已知明文攻击)。

总体而言,这不能保证文件的安全性,但对于您的目的来说应该是非常合适的。

此外,由于您要求可能的 PHP 解决方案:

<?php
function load_xor_file($filename) {
    $key = "YOUR SECRET KEY HERE";
    $in = file_get_contents($filename);
    $keyrep = str_repeat($key,ceil(strlen($in)/strlen($key)));
    return $in ^ $keyrep;
}
function save_xor_file($filename,$data) {
    $key = "YOUR SECRET KEY HERE";
    $keyrep = str_repeat($key,ceil(strlen($data)/strlen($key)));
    file_put_contents($filename,$data ^ $keyrep);
}
?>

PS。我知道这个问题已经相当老了,但我只是随机浏览 Game Maker 标签:p

于 2012-02-25T02:59:24.850 回答