所以我正在为我的A级项目创建一个游戏,我现在处于需要能够加密和解密文本文件的阶段。
我已经想出了在GCM模式下使用AES-256进行加密,但是我使用的是随机生成的密钥和IV,以便首先加密数据。所以我想知道,有没有什么方法可以在不知道密钥和iv的情况下解密文本文件。或者,在下面显示的加密方法中,有没有什么我可以更改的,这样我就可以在稍后解密文本时知道密钥和iv。
注意:我使用libGDX库来创建游戏,这就是为什么我不使用标准方法来写入文本文件。
加密方法:
public void encrypt ()
{
byte[] input = w.getSprites().toString().getBytes(); // Data to be encrypted
byte[] encrypted = null; // Encrypted output
Cipher cipher; // Cipher algorithm to be used
try {
// Setup the cipher algorithm to use and select the wanted mode
// AES is the cipher algorithm GCM is the mode
cipher = Cipher.getInstance("AES/GCM/NoPadding");
// Generate a random key for the encryption
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
SecretKey key = keyGenerator.generateKey();
// Generate a random iv for the encryption
SecureRandom randomSecureRandom = new SecureRandom();
byte[] iv = new byte[cipher.getBlockSize()];
randomSecureRandom.nextBytes(iv);
// Encrypt the data
cipher.init(Cipher.ENCRYPT_MODE, key, randomSecureRandom);
encrypted = new byte[cipher.getOutputSize(input.length)];
int enc_len = cipher.update(input, 0, input.length, encrypted, 0);
enc_len += cipher.doFinal(encrypted, enc_len);
}
catch (NoSuchAlgorithmException |
NoSuchPaddingException |
InvalidKeyException |
ShortBufferException |
IllegalBlockSizeException |
BadPaddingException e) { e.printStackTrace(); }
FileHandle f = Gdx.files.local("bin/default/saves/default/test.txt");
f.writeString(encrypted.toString(), false);
}
提前感谢您的任何答复,他们非常感谢。
发布于 2018-10-13 03:09:08
不,在不知道密钥的情况下无法解密。如果任何人都可以在没有密钥的情况下解密消息,那么加密的意义何在?
如果这是为了对本地用户隐藏数据,那么最好的办法就是对数据进行模糊处理。机器需要知道密钥才能对其进行加密和解密,任何有权访问该机器的人最终都可以找到该密钥,并使用它为自己解密数据。即使您不向磁盘写入任何内容,本地用户也可以查看内存并找到密钥。还要记住,代码是可以反编译的。
基本上只要记住,任何拥有物理访问权限的人都是王者,你不能真正阻止他们,只能放慢他们的速度。
所以你能做的最好的事情就是让它尽可能的痛苦来得到钥匙。类文件或属性文件中的字符串字面值很容易阅读,而且一点也不痛苦,所以要避免使用它们。
有关处理本地安全性的相关方法,请参阅this question。
另外,也可以考虑使用像Proguard这样的工具来混淆(和优化)你的代码。
https://stackoverflow.com/questions/52785410
复制相似问题