Estoy tratando de encriptar un flujo de entrada de Glide.
Convertí el flujo de entrada en una matriz de bytes y lo pasé en mi método de cifrado:
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() }
Los registros se ven así:
inputsize: 750683 outputsize: 750699 encodedBytesSize: 95339 byteBuffer: 95351
Como puede ver, la matriz de bytes de la imagen encriptada es demasiado pequeña y no entiendo por qué. Si trato de encriptar cadenas o imágenes más pequeñas (alrededor de 100kb-200kb), funciona de maravilla.
¡Gracias por ayudarme!
Saludos amables tom
Parece que te has topado con un error, curiosamente en una ubicación ilógica: 95339 es un número primo. Casi pensarías que algún desarrollador dejó ese valor por propósito, en caso de que lo olvidara o para probar el equipo de prueba.
Sin embargo, no es una buena idea almacenar en caché todos los datos en la memoria para franjas de información tan grandes, incluso para GCM. Debería intentar usar la transmisión en su lugar. Puede usar CipherOutputStream
para realizar el cifrado y CipherInputStream
para el descifrado. Puede conectar estos flujos a otros flujos como FileOutputStream
y FileInputStream
para leer/escribir directamente en el sistema de archivos. También es posible escribir el IV en estos flujos subyacentes.
Tenga en cuenta que puede haber grandes diferencias en la forma en que los diferentes proveedores manejan GCM. Como ha notado, el asociado con el almacén de claves de Android se creó para la seguridad, de todos modos, de la clave, en lugar de la velocidad. Es posible que otras implementaciones de GCM no muestren este error. Tenga en cuenta que los proveedores disponibles pueden diferir entre diferentes plataformas Java(-esk) y versiones de estas plataformas.