如何在Java中使用未知的KEY和IV解密AES?

时间:2018-10-12 18:44:15

标签: java encryption cryptography aes aes-gcm

所以我正在为我的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);
}

在此先感谢您的回答,非常感谢。

2 个答案:

答案 0 :(得分:1)

否,您无法在不知道密钥的情况下解密。如果任何人甚至都没有密钥就可以解密消息,那么加密的重点是什么?

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

基本上,请记住,任何具有物理访问权限的人都是国王,您无法真正阻止他们,只是放慢他们的速度。

因此,您能做的最好的事情就是使获取密钥尽可能地痛苦。类文件或属性文件中的字符串文字易于阅读,并且一点也不痛苦,因此请避免使用它们。

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

也可以考虑使用类似Proguard之类的工具来模糊处理(并优化)您的代码。

答案 1 :(得分:1)

您可以尝试蛮力攻击。

  

用蛮力破坏对称的256位密钥需要比128位密钥高2128倍的计算能力。从理论上讲,五十台超级计算机每秒可检查10亿个(1018)AES密钥(如果可以制造这样的设备),则理论上将需要3×1051年的时间来耗尽256位密钥空间。

Per wikipedia

实际上,认为256位AES在计算上不可行。唯一“可行”的解密方式是使用与加密相同的密钥。 Some background on AES.

有一种叫做Biclique attack.的更快的方法(对于256位在计算上仍然不可行),但我认为这超出了您的要求。

如果您决定需要将AES密钥从加密人员传递给解密人员,则可以使用使用非对称密钥的RSA encryption。看看我的github for a basic RSA implementation.