Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

151
Views
Cifrado AES de Android Faltan bytes después de Cipher.doFinal

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

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!