Шифрование Android AES отсутствует в байтах после Cipher.doFinal - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь зашифровать входной поток от glide.

Я преобразовал входной поток в байтовый массив и передал его в своем методе шифрования:

fun encrypt(input: ByteArray): ByteArray {

    Log.e("TAG", "inputsize: ${input.size}")

    val iv           = ByteArray(KeyStoreHelper.IV_SIZE)
    val secureRandom = SecureRandom()
    secureRandom.nextBytes(iv)

    val c = Cipher.getInstance(KeyStoreHelper.AES_MODE)
    c.init(Cipher.ENCRYPT_MODE, getKey(), GCMParameterSpec(KeyStoreHelper.GCM_SIZE, iv))
    Log.e("TAG", "outputsize: ${c.getOutputSize(input.size)}")
    val encodedBytes = c.doFinal(input)

    Log.e("TAG", "encodedBytesSize: ${encodedBytes.size}")

    val byteBuffer = ByteBuffer.allocate( iv.size + encodedBytes.size)
    byteBuffer.put(iv)
    byteBuffer.put(encodedBytes)

    Log.e("TAG", "byteBuffer: ${byteBuffer.array().size}")


    return byteBuffer.array()
}

Журналы выглядят так:

inputsize: 750683 
outputsize: 750699 
encodedBytesSize: 95339 
byteBuffer: 95351

Как вы можете видеть, байтовый массив зашифрованных изображений очень мал, и я не понимаю, почему - если я пытаюсь зашифровать строки или изображения меньшего размера (около 100–200 КБ), он работает как шарм.

Спасибо за помощь!

С уважением, Том

1 Ответ

0 голосов
/ 05 марта 2019

Кажется, вы столкнулись с ошибкой, как ни странно в нелогичном месте: 95339 - простое число.Вы бы почти подумали, что какой-то разработчик оставил это значение по назначению, на случай, если он забыл или проверил команду тестирования.

Однако не рекомендуется кэшировать все данные в памяти для таких больших рядов.информации, даже для GCM.Вместо этого вы должны попробовать использовать потоковую передачу.Вы можете использовать CipherOutputStream для шифрования и CipherInputStream для расшифровки.Вы можете подключить эти потоки к другим потокам, таким как FileOutputStream и FileInputStream для непосредственного чтения / записи в файловую систему.Также возможно записать IV в эти базовые потоки.

Помните, что могут быть большие различия в том, как обрабатывается GCM различными поставщиками.Как вы заметили, хранилище ключей для Android было построено для обеспечения безопасности - в любом случае ключа - а не скорости.Другие реализации GCM могут не показывать эту ошибку.Помните, что доступные поставщики могут различаться для разных платформ Java (-esk) и версий этих платформ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...