языки: < /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, извлеченный из файла, имеет ожидаемую длину. Реализация. Заранее спасибо за вашу помощь.
Environment [list] [*][b]Platform:[/b] React Native (Android) [*][b]Module Type:[/b] Turbo Module [*][b]Encryption:[/b] AES-GCM (with a 32-byte key) [*] [b] языки: < /strong> kotlin (для турбо -модуля) и Python (для тестирования) < /li> Размеры файлов: < /strong>
Маленькие файлы (~ 10 МБ): Decryption достигает успеха ✅ < /li> decry): decry): decry) Aeadbadtagexception ❌ [/list]
Описание вопроса Я реализовал шифрование и расшифровку файлов в пользовательском турбо -модуле для моего нативного применения Android. В то время как дешифрование отлично работает для небольших файлов (~ 10 МБ), он не работает для более крупных файлов (~ 25 МБ) с Aeadbadtagexception . Это поведение неожиданно, поскольку тот же ключ и IV используются неизменно в разных размерах файлов. Я бы очень признателен за любую информацию о том, почему это может происходить и как я могу его разрешить. Aeadbadtagexception .
Журнал диагностики для неудачной попытки расшифровки заключается в следующем: [code]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)
[*] Что может вызвать недостаток расшифровки для более крупных файлов? /> < /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()
Platform: React Native (Android)
Module Type: Turbo Module
Encryption: AES-GCM (with a 32-byte key)
языки: kotlin (для турбо -модуля) и Python (для тестирования)
Размеры файлов:
Пожалуйста, помогите мне. Я хочу зашифровать с использованием алгоритма AES-GCM в коде c Sharp, ниже приведен мой код.
Однако он не может расшифровать. Я хочу сохранить код расшифровки.
Как решить эту проблему? Пожалуйста, помогите мне.
//...
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь...
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь...
Я пытаюсь расшифровать сообщение (полученное через Wireless M-Bus). Используемый метод — AES-128 GCM. У меня есть правильный ключ для этого. Я знаю это, потому что могу расшифровать полученные сообщения с помощью программы в Windows.
Однако теперь...