Шифрование AES256 - PullRequest
       6

Шифрование AES256

0 голосов
/ 21 мая 2018

Мне трудно правильно зашифровать строку в AES256.Мои требования состоят в том, что это должны быть AES256 и CBC, а IV длины 24 должен быть добавлен к зашифрованной строке.У меня уже есть ключ, который предоставляется, и он остается прежним.

Мой код

   public String encrypt(String value) {


    try {
        SecureRandom secureRandom = new SecureRandom();
        byte[] ivBytes = new byte[16];
        secureRandom.nextBytes(ivBytes);

        SecretKeySpec skeySpec = new SecretKeySpec(byteArray, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(ivBytes));

        byte[] encrypted = cipher.doFinal(value.getBytes());

        Log.d("encrypted", String.format("%s", encrypted.length));

        return Base64.encodeToString(ivBytes, Base64.DEFAULT) + Base64.encodeToString(encrypted, Base64.DEFAULT);


    } catch (Exception ex) {
        ex.printStackTrace();
    }

    return null;
}

Здесь возникли проблемы с парой.Если я изменю 16 на 24 для ivBytes, я получаю сообщение об ошибке, в котором говорится, что ожидаемая длина iv равна 16, а не 24. Я также не уверен, шифруется ли этот код в AES256 или AES.Любая помощь приветствуется.Кстати, значение является шестнадцатеричным, например, это может быть что-то вроде 831684e1.Не уверен, влияет ли это на шифрование.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Это решено.Я правильно делал шифрование, я просто не понимал, что Base64 добавил новую строку в мою строку.Это привело к неверному URL.Поэтому, чтобы исправить это, мне пришлось использовать Base64.NOWRAP вместо Base64.DEFAULT

0 голосов
/ 21 мая 2018

Пара вопросов здесь.Если я изменю 16 на 24 для ivBytes, я получаю ошибку, которая говорит, что ожидаемая длина iv равна 16, а не 24.

Это правильно.AES определяется только с размером блока 128 бит / 16 байтов.А для CBC требуется случайная (измеренная) IV единичного блока.

Я также не уверен, шифруется ли этот код в AES256 или AES.

Мы также не уверены, так как byteArray не указан, и реализация AES в Java / Android выбирает между AES-128, -192 или -256, используя размер ключа.Обратите внимание, что ключ также должен состоять из рандомизированных байтов (а не пароля, закодированного в байтах).С Android все в порядке, но для Java вам могут понадобиться файлы Unlimited Crypto для более старых версий Java Runtime Environment (JRE).

Излишне говорить, что byteArray должно быть 32 байта для AES-256.

Кстати, значение является шестнадцатеричным, например, это может быть что-то вроде 831684e1.Не уверен, влияет ли это на шифрование.

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

В настоящее время вы используете value.getBytes(), что означает, что вы получитеспецифичная для платформы кодировка шестнадцатеричных символов (UTF-8 для Android, но в основном вы получите US-ASCII, поскольку шестнадцатеричные числа всегда кодируются как один байт на символ).Другими словами, вы должны закодировать двоичное значение дважды , в то время как кодирование вообще не требуется.

...