Дешифрование AES-GCM сбой для больших файлов в Native Turbo Module React (написано с помощью Kotlin)Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Дешифрование AES-GCM сбой для больших файлов в Native Turbo Module React (написано с помощью Kotlin)

Сообщение Anonymous »

Environment
  • Platform: React Native (Android)
  • Module Type: Turbo Module
  • Encryption: AES-GCM (with a 32-byte key)
  • языки: < /strong> kotlin (для турбо -модуля) и Python (для тестирования) < /li>
    Размеры файлов: < /strong>

    Маленькие файлы (~ 10 МБ): Decryption достигает успеха ✅ < /li>
    decry): decry): decry) Aeadbadtagexception ❌



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

Журнал диагностики для неудачной попытки расшифровки заключается в следующем:

Код: Выделить всё

IV Hex: 143CEBC57F8D2D6BC00BB8D2
IV Base64: FDzrxX+NLWvAC7jS
Key Base64: GVdyBd3JD4gAaFZeBVLEJHOdULsIIhc9lITsSWBF36Y=
Key Length: 32 bytes
< /code>
 kotlin Реализация дешифрования < /h3>
private fun decryptInputStreamAES_GCM(
inputStream: InputStream,
outputStream: OutputStream,
key: SecretKey
): String {
val startTime = System.nanoTime()

try {
// Read IV from the input stream
val iv = ByteArray(12)
var totalIvBytesRead = 0
while (totalIvBytesRead < 12) {
val bytesRead = inputStream.read(iv, totalIvBytesRead, 12 - totalIvBytesRead)
if (bytesRead == -1) {
throw IllegalStateException("Incomplete IV: Only read $totalIvBytesRead bytes")
}
totalIvBytesRead += bytesRead
}

// Logging IV and Key
val ivHex = iv.joinToString("") { "%02X".format(it) }
val ivBase64 = Base64.encodeToString(iv, Base64.NO_WRAP)
val keyBase64 = Base64.encodeToString(key.encoded, Base64.NO_WRAP)

// Initialize cipher
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val gcmParams = GCMParameterSpec(128, iv)
cipher.init(Cipher.DECRYPT_MODE, key, gcmParams)

// Adaptive buffering
val inputBufferSize = 32768  // 32KB buffer
val inputBuffer = ByteArray(inputBufferSize)
val outputBuffer = ByteArray(inputBufferSize + cipher.blockSize)

var totalBytesDecrypted = 0L
var bytesRead: Int

// Decrypting in chunks
while (inputStream.read(inputBuffer).also { bytesRead = it } != -1) {
val outputSize = cipher.update(inputBuffer, 0, bytesRead, outputBuffer, 0)
if (outputSize > 0) {
outputStream.write(outputBuffer, 0, outputSize)
totalBytesDecrypted += outputSize
}
}

// Final block processing
val finalOutputBuffer = ByteArray(cipher.getOutputSize(0))
val finalBlockSize = cipher.doFinal(finalOutputBuffer, 0)

if (finalBlockSize > 0) {
outputStream.write(finalOutputBuffer, 0, finalBlockSize)
totalBytesDecrypted += finalBlockSize
}

return JSONObject().apply {
put("decryptedLength", totalBytesDecrypted)
}.toString()
} catch (e: Exception) {
Log.e("Decryption", "Error", e)
throw e
}
}
< /code>
 Вопросы < /h2>

[*]   Что может вызвать недостаток расшифровки для более крупных файлов? /> < /li>
   есть ли известное ограничение с AES-GCM в отношении больших файлов в этой реализации? Измените процесс расшифровки, чтобы убедиться, что он работает для всех размеров файлов? />  Ключ и IV остаются  согласованными [/b] по размерам файлов.
[*] [b] Различные размеры буферов [/b] были проверены, но проблема сохраняется.  [b]encryption and decryption logic[/b] is uniform regardless of file size.

Additional Context: Python Decryption Verification
To cross-check, I used the following Python script to decrypt the same files successfully:
from Crypto.Cipher import AES
import base64

def decrypt_gcm(encrypted_file_path, output_file_path, key_base64, iv_base64):
# Decode key and IV
key = base64.b64decode(key_base64)
iv = base64.b64decode(iv_base64)

# Read encrypted file
with open(encrypted_file_path, 'rb') as f:
# Skip first 12 bytes (IV)
f.read(12)
ciphertext = f.read()

# Create cipher
cipher = AES.new(key, AES.MODE_GCM, nonce=iv)

try:
# Decrypt
decrypted_data = cipher.decrypt(ciphertext)

# Write decrypted data
with open(output_file_path, 'wb') as f:
f.write(decrypted_data)

print("Decryption successful!")
except Exception as e:
print(f"Decryption failed: {e}")

# Usage
decrypt_gcm("encrypted.enc", "decrypted.mp4",
"gS8q4a8B2hJ9yVKIl7F0ril6GMzthZHHCRXVQ6rI854=",
"IJidrs9f55XaYgHJ")
Я могу подтвердить, что:

[*] Ключ и iv верны .
IV, извлеченный из файла, имеет ожидаемую длину. Реализация. Заранее спасибо за вашу помощь.

Подробнее здесь: https://stackoverflow.com/questions/794 ... written-wi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»