游戏数据的基本加密

时间:2012-08-09 22:52:44

标签: java encryption

我想我正在寻找某种基本的文件加密,但不知道从哪里开始。

我正在找人告诉我从哪里开始寻找,或者更好的是,提供一些代码。

我写过一款游戏,目前将数据保存到一般文本文件中。当然,任何希望这样做的人都可以改变这一点。

我需要的是创建一个可以存储整数和字符串的文件,即使不是不可能在游戏之外编辑也很困难。

在我的搜索中,我遇到了.dat文件,但它们似乎比我正在寻找的更复杂。

所有帮助表示赞赏,Alex。

4 个答案:

答案 0 :(得分:2)

您可以将数据写入ByteBuffer,然后通过简单的算法扭曲数据。例如,假设您要保存的数据是String数组,您可以这样做:

String[] data; // the data you want to save
int byteLength = 0;
byte[][] bytes = new byte[data.length][];

// Calculate the length of the content.
for(int i=0; i<data.length; i++) {
    bytes[i] = data[i].getBytes();
    byteLength += bytes[i].length;
    byteLength += 4; // this is for an integer, which is for the length of the String
}

// Transfer the content to a ByteBuffer object
ByteBuffer buffer = ByteBuffer.allocate(byteLength);
for(int i=0; i<bytes.length; i++) {
    // Put the length of the current byte array
    buffer.putInt(bytes[i].length);
    for(int j=0; j<bytes[i].length; j++) {
        // Reverse the byte so that it can't be understood
        buffer.put((byte)(~bytes[i][j])); 
    }
}

将所有内容写入ByteBuffer对象后,您可以获取生成的字节数组并将其写入文件。

FileOutputStream fos = new FileOutputStream("YourFileName.anyExtension");
fos.write(buffer.array());
fos.close();

在读回文件时,你应该首先读取一个整数,这是你应该读取为字节数组的数据的长度,然后你应该读取这个字节数组。

FileInputStream fis = new FileInputStream("YourFileName.anyExtension");
DataInputStream dis = new DataInputStream(fis);
ArrayList<String> list = new ArrayList<String>();
byte[] bytes;
while(dis.available()) {
    int length = dis.readInt();
    bytes = new byte[length];
    for(int i=0; i<length; i++) {
        // Those bytes were reversed, right?
        bytes[i] = (byte)(~dis.readByte());
    }
    // Convert byte array to String
    String str = new String(bytes);
    list.add(str);
}

现在你有了一个String数据的ArrayList。

当然,这不是最好,最安全,最快的算法。您总能找到或创建更快。但我认为这是做这类事情的好例子。

答案 1 :(得分:0)

如果您正在使用Java,您可以尝试创建一个实现Serializable的类。这样您就可以创建一个包含所有元信息的对象,序列化它,当您想要加载它时,只需再次反序列化它。 / p>

它不是很安全,因为你只需要知道它是用它制作的类,反序列化它。但这是开始的事情。

答案 2 :(得分:0)

查看digital signatures,特别是HMAC。这些正是您所需要的,Java Crypto框架应该让事情变得非常简单。这是一个可能相关的SO条目:How to generate an HMAC in Java equivalent to a Python example?

答案 3 :(得分:0)

您可以通过CipherOutputStream

传递文件写入流

生成随机字符串或数字或任何内容。获取其字节数组,生成一个密钥,并使用它来加密您的文件。

    byte password[] = (WHAT YOUR WANT. STRING, NUMBER, etc.).getBytes();
    DESKeySpec desKeySpec;
    try {

        desKeySpec = new DESKeySpec(password);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(desKeySpec);

        Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        desCipher.init(Cipher.ENCRYPT_MODE, key);

        // Create stream
        FileOutputStream fos = new FileOutputStream("Your file here");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        CipherOutputStream cos = new CipherOutputStream(bos, desCipher);
    }

现在您可以使用cos

写入文件

使用SecretKey对象

以相同的方式读取文件
SecretKey key = loadKey(); // Deserialize your SecretKey object
try {
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            FileInputStream fis = new FileInputStream("Your file here");
            BufferedInputStream bis = new BufferedInputStream(fis);
            CipherInputStream cis = new CipherInputStream(bis, cipher);

现在您可以使用cis

阅读

缺点是您需要保留SecretKey对象(序列化它或其他东西),对于任何低级别黑客来说,获取数据都不会有问题(因为密钥存储在设备上)但是它不允许仅使用文本编辑器更改数据。