Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用未知密钥和IV解密AES?_Java_Encryption_Cryptography_Aes_Aes Gcm - Fatal编程技术网

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

如何在Java中使用未知密钥和IV解密AES?,java,encryption,cryptography,aes,aes-gcm,Java,Encryption,Cryptography,Aes,Aes Gcm,所以我正在为我的a级项目创建一个游戏,我现在处于需要能够加密和解密文本文件的阶段 我已经在GCM模式下使用AES-256解决了加密问题,但是我首先使用随机生成的密钥和IV来加密数据。所以我想知道,有没有什么方法可以在不知道密钥和iv的情况下解密文本文件。 或者,根据下面显示的加密方法,是否有任何我可以更改的内容,以便在稍后解密文本时知道密钥和iv 注意:我正在使用libGDX库创建游戏,这就是为什么我没有使用标准方法写入文本文件的原因 加密方法: public void encrypt () {

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

提前感谢您的回答,非常感谢。

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

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

基本上只要记住,任何一个有物理访问权限的人都是国王,你不能真正阻止他们,只是让他们慢下来

因此,你能做的最好的事情就是尽可能让拿到钥匙的过程变得痛苦。类文件或属性文件中的字符串文字很容易读取,而且一点也不痛苦,因此请避免使用这些文字

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


也可以考虑使用一种工具来对代码进行模糊(和优化),一般来说。

< P>你可以尝试蛮力攻击。< /P> 用暴力破解一个对称的256位密钥需要2128倍于128位密钥的计算能力。理论上,50台超级计算机每秒可以检查10亿(1018)个AES密钥(如果能够制造出这样的设备的话),需要大约3×1051年来耗尽256位密钥空间

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

有一个更快的方法(256位的计算仍然不可行),但是我认为这超出了你的要求


如果您决定需要将AES密钥从加密人员传递到解密人员,您可以使用使用非对称密钥的解密人员。看看我的

不,不知道密钥就无法解密。如果任何人都可以在没有密钥的情况下解密消息,那么加密的意义是什么?如果不知道密钥和iv,这是不可能的。不过,有一点是,您通常会看到未加密的iv包含在保存数据的初始字节中。这样保存静脉注射没有问题。您的RSA实现不安全。它不使用任何填充物。不要推荐RSA用于传输安全。TLS的存在是有原因的。@LukeJoshuaPark感谢您的评论,如果我有误导性,请随时编辑我的答案。。RSA实现纯粹是为了概念验证,我认为它可能有助于理解这些选项。当然,TLS是传递对称密钥的公认方式,但讨论如何实现TLS握手我认为是这个问题的主题。它的美妙之处在于你不必自己实现它。不要重新发明轮子!因此,因为这是一个所有数据都将存储在用户计算机上的游戏,所以直接对数据进行模糊处理并同时切断加密是否更有益。@QuickJAB您仍然可以使用加密作为模糊处理的形式,但密钥必须存在于本地计算机的某个位置,以便游戏可以解密这些密钥由于密钥将存在于计算机的某个位置,用户可以找到它们并使用它们为自己解密资源。这取决于你找到钥匙有多难。