我想我正在寻找某种基本的文件加密,但不知道从哪里开始。
我正在找人告诉我从哪里开始寻找,或者更好的是,提供一些代码。
我写过一款游戏,目前将数据保存到一般文本文件中。当然,任何希望这样做的人都可以改变这一点。
我需要的是创建一个可以存储整数和字符串的文件,即使不是不可能在游戏之外编辑也很困难。
在我的搜索中,我遇到了.dat文件,但它们似乎比我正在寻找的更复杂。
所有帮助表示赞赏,Alex。
答案 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
对象(序列化它或其他东西),对于任何低级别黑客来说,获取数据都不会有问题(因为密钥存储在设备上)但是它不允许仅使用文本编辑器更改数据。