首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中用未知密钥和IV解密AES?

如何在Java中用未知密钥和IV解密AES?
EN

Stack Overflow用户
提问于 2018-10-13 02:44:15
回答 1查看 6.8K关注 0票数 1

所以我正在为我的A级项目创建一个游戏,我现在处于需要能够加密和解密文本文件的阶段。

我已经想出了在GCM模式下使用AES-256进行加密,但是我使用的是随机生成的密钥和IV,以便首先加密数据。所以我想知道,有没有什么方法可以在不知道密钥和iv的情况下解密文本文件。或者,在下面显示的加密方法中,有没有什么我可以更改的,这样我就可以在稍后解密文本时知道密钥和iv。

注意:我使用libGDX库来创建游戏,这就是为什么我不使用标准方法来写入文本文件。

加密方法:

代码语言:javascript
复制
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);
}

提前感谢您的任何答复,他们非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-13 03:09:08

不,在不知道密钥的情况下无法解密。如果任何人都可以在没有密钥的情况下解密消息,那么加密的意义何在?

如果这是为了对本地用户隐藏数据,那么最好的办法就是对数据进行模糊处理。机器需要知道密钥才能对其进行加密和解密,任何有权访问该机器的人最终都可以找到该密钥,并使用它为自己解密数据。即使您不向磁盘写入任何内容,本地用户也可以查看内存并找到密钥。还要记住,代码是可以反编译的。

基本上只要记住,任何拥有物理访问权限的人都是王者,你不能真正阻止他们,只能放慢他们的速度。

所以你能做的最好的事情就是让它尽可能的痛苦来得到钥匙。类文件或属性文件中的字符串字面值很容易阅读,而且一点也不痛苦,所以要避免使用它们。

有关处理本地安全性的相关方法,请参阅this question

另外,也可以考虑使用像Proguard这样的工具来混淆(和优化)你的代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52785410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档