128-битные блоки Эрджельского Rijndael 256-битные ключи Реализация в Java - PullRequest
0 голосов
/ 20 декабря 2018

К сожалению, я не очень знаком с криптографией, но мне нужно реализовать этот алгоритм в java8.Это означает, что у меня уже есть некоторые данные, зашифрованные с помощью этого подхода, написанные на C, и ключ, который является 256-битным, и мне нужно расшифровать эти данные, используя некоторый код Java.Обратите внимание, что все, что мы имеем в подходе Эрдельского, является ключом, здесь нет «соли» и «вектора инициализации» (по крайней мере, явно, но я могу ошибаться).

Что я пробовал?Ну, немного:

  • Я пытался BouncyCastle , но он не может расшифровать мои данные (он использует 'iv', я установил все ноль, поэтому это может быть проблемой)
  • Я использую Java 1.8.112 Я получил исключение «Недопустимый размер ключа или параметры по умолчанию», и я попытался Взломать мой 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 голосов
/ 21 января 2019

Некоторый дополнительный фон. Я пытался создать 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 или загрузитеи установите эту политику неограниченной юрисдикции .
  3. Вы должны использовать ECB шифрование, чтобы соответствовать Rijndael Эрдельского, это на менее безопасно , чем CBC,но он все еще может быть использован для совместимости.

ThaNKS всем за ответ и обсуждение.Ура!

...