Erdelsky的Rijndael 128位块256位密钥在Java中的实现

时间:2018-12-20 14:07:10

标签: java encryption cryptography aes rijndael

不幸的是,我对密码学不太熟悉,但是我需要在java8中实现this algorithm。这意味着,我已经用这种用C编写的方法加密了一些数据,并且密钥是256位,并且我需要使用一些Java代码解密该数据。请注意,Erdelsky方法中所拥有的只是一个密钥,没有“盐”和“初始化向量”(至少是显式的,但我可能会误会)。

我尝试了什么?好吧,一点:

  • 我尝试了BouncyCastle,但是它无法解密我的数据(它使用的是'iv',我将其全部设置为零,因此可能是个问题)
  • 我正在使用Java 1.8.112,但出现了“密钥大小或默认参数非法”异常,并且我尝试Hack my JDK使其与256位密钥一起使用,(它也使用了“ iv” ),但它也无法解密我的数据。代码如下:

    public static void DecryptData(byte[] Contents, int NumBytes, byte[] KeyBytes, int KeyOffset, int NumKeyBytes)
    {
        final int AESBlockSize = 16;
        final byte[] EncryptionDecryptionBuffer = new byte[AESBlockSize];
        final byte[] InitializingVector = {
            0, 0, 0, 0,
            0, 0, 0, 0,
            0, 0, 0, 0,
            0, 0, 0, 0
        };
        try
        {
            final Cipher AES256Cipher = Cipher.getInstance("AES/CBC/NoPadding");
            final SecretKeySpec secretKeySpec = new SecretKeySpec(KeyBytes, KeyOffset, NumKeyBytes, "AES");
    
            AES256Cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(InitializingVector));
    
            // Decrypt the data a block at a time
            for (int Offset = 0; Offset < NumBytes; Offset += AESBlockSize)
            {
                // Update and copy to the EncryptionDecryptionBuffer
                AES256Cipher.update(Contents, Offset, AESBlockSize, EncryptionDecryptionBuffer);
    
                // Copy to the initial array
                System.arraycopy(EncryptionDecryptionBuffer, 0, Contents, Offset, AESBlockSize);
            }
        }
        catch (GeneralSecurityException e)
        {
            throw new RuntimeException(e);
        }
    }
    

我仍在寻找解决方案,请提供帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

一些额外的背景。 我试图为某些游戏引擎创建打包算法的Java实现。我假设,选择了 ECB 加密以减少不同版本的打包资产之间的熵(因为修补系统正在尝试将已加密内容的块安装到现有数据中)。关于JDK 1.8.112,该如何处理-我使用Excelsior Jet来AOT编译我的程序(它将是开源的,我将在稍后将链接附加到这篇文章),但是不幸的是,我的上一个版本AOT编译器仅支持1.8.112,因此我使用相同的JDK版本以确保兼容性。

事实上,对于非密码专家(如我)的详细回答:

  1. 块大小始终为 16 个字节,这完全可以。
  2. 密钥长度为 256 位宽(或 32 字节),您不能在较早的JDK修补程序中使用该长密钥,但是后来,限制有已被删除,因此请将您的JDK更新为Java 9,Java 8u161,Java 7u171或6u181,或下载并安装此Unlimited Strength Jurisdiction Policy
  3. 您必须使用 ECB 加密来匹配Erdelsky的Rijndael,这比CBC高less secure,但出于兼容性原因,仍可以使用它。

感谢大家的回答和讨论。干杯!