Android - javax.crypto.AEADBadTagException
Android - javax.crypto.AEADBadTagException
我目前在尝试解密我已加密的文件时收到 AEADBadTagException。我几乎在 Whosebug 上到处搜索但找不到解决方案,希望我犯了一个小错误或与编码等有关,因为 GCM 无法验证它正在生成的标签。
我认为问题出在我尝试 encrypt/decrypt 的文件中。完全相同的代码适用于图像,但是,当我尝试加密 PDF 时,它失败并出现上述错误。
下面的代码没有使用 CipherOutputStream/CipherInputStream,但我已经尝试过,但没有成功。
我知道 encryption/decryption 方法不应该这样写,尤其是硬编码 IV,但现在我只是想让它工作,然后再适当地保护这些方法。
我正在使用 Android KeyStore 来获取我的密钥。我知道这部分是有效的,因为我在应用程序中有很多其他的部分使用相同的方法使用密钥库。另外,此方法适用于图像。
错误发生在 cipher.doFinal(encryptedBytes) 上。当我使用 CipherInputStream 时,它发生在 CipherInputStream(EncryptedFileStream, cipher)
这是代码和错误堆栈,非常感谢任何帮助:
加密
val fileBytes = inputStream.readBytes()
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
keyStoreService.checkKeyAndCreate(ALIAS_FILE_KEY)
val key = keyStoreService.getFileKey(ALIAS_FILE_KEY)
val iv = byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
cipher.init(Cipher.ENCRYPT_MODE, key, GCMParameterSpec(128, iv))
val encryptedBytes = cipher.doFinal(fileBytes)
outputStream = FileOutputStream(file)
outputStream.write(encryptedBytes)
outputStream.flush()
inputStream.close()
outputStream.close()
解密
val encryptedFile = File(filePath)
val encryptedBytes = encryptedFile.readBytes()
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val key = keyStoreService.getFileKey(ALIAS_FILE_KEY)
val iv = byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
cipher.init(Cipher.DECRYPT_MODE, key, GCMParameterSpec(128, iv))
val decryptedBytes = cipher.doFinal(encryptedBytes)
return ByteArrayInputStream(decryptedBytes)
堆栈跟踪
E/AndroidRuntime: FATAL EXCEPTION: main
Process: onboard.app.passageways, PID: 15441
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: javax.crypto.AEADBadTagException
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:517)
at javax.crypto.Cipher.doFinal(Cipher.java:2055)
at passageways.android.onboard.services.EncryptionService.readEncryptedFile(EncryptionService.kt:79)
at passageways.android.onboard.fragments.MeetingBookDialogFragment.onViewCreated(Fragment.kt:38)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.security.KeyStoreException: Signature/MAC verification failed
at android.security.KeyStore.getKeyStoreException(KeyStore.java:839)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
at android.security.keystore.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer.doFinal(AndroidKeyStoreAuthenticatedAESCipherSpi.java:373)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
at javax.crypto.Cipher.doFinal(Cipher.java:2055)
at passageways.android.onboard.services.EncryptionService.readEncryptedFile(EncryptionService.kt:79)
at passageways.android.onboard.fragments.MeetingBookDialogFragment.onViewCreated(Fragment.kt:38)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
事实证明 readBytes() 使用默认缓冲区大小,并且只有 returns 字节缓冲区的长度。所以它实际上并没有以字节为单位返回整个文件,只是缓冲区的长度。
我已经切换到使用 CipherOutputStream,请务必在将内容写入标签后包含 flush() !
我遇到了同样的错误,最后我找到了答案。
当我加密(数据1)和加密(数据2)时,我想通过解密(data1.encryptStr)获取数据1,我遇到了这个问题(原因:android.security.KeyStoreException:Signature/MAC验证失败)。
所以,如果你上传 2 个文件,你无法通过解密获得第一个文件
我目前在尝试解密我已加密的文件时收到 AEADBadTagException。我几乎在 Whosebug 上到处搜索但找不到解决方案,希望我犯了一个小错误或与编码等有关,因为 GCM 无法验证它正在生成的标签。
我认为问题出在我尝试 encrypt/decrypt 的文件中。完全相同的代码适用于图像,但是,当我尝试加密 PDF 时,它失败并出现上述错误。
下面的代码没有使用 CipherOutputStream/CipherInputStream,但我已经尝试过,但没有成功。
我知道 encryption/decryption 方法不应该这样写,尤其是硬编码 IV,但现在我只是想让它工作,然后再适当地保护这些方法。
我正在使用 Android KeyStore 来获取我的密钥。我知道这部分是有效的,因为我在应用程序中有很多其他的部分使用相同的方法使用密钥库。另外,此方法适用于图像。
错误发生在 cipher.doFinal(encryptedBytes) 上。当我使用 CipherInputStream 时,它发生在 CipherInputStream(EncryptedFileStream, cipher)
这是代码和错误堆栈,非常感谢任何帮助:
加密
val fileBytes = inputStream.readBytes()
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
keyStoreService.checkKeyAndCreate(ALIAS_FILE_KEY)
val key = keyStoreService.getFileKey(ALIAS_FILE_KEY)
val iv = byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
cipher.init(Cipher.ENCRYPT_MODE, key, GCMParameterSpec(128, iv))
val encryptedBytes = cipher.doFinal(fileBytes)
outputStream = FileOutputStream(file)
outputStream.write(encryptedBytes)
outputStream.flush()
inputStream.close()
outputStream.close()
解密
val encryptedFile = File(filePath)
val encryptedBytes = encryptedFile.readBytes()
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
val key = keyStoreService.getFileKey(ALIAS_FILE_KEY)
val iv = byteArrayOf(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
cipher.init(Cipher.DECRYPT_MODE, key, GCMParameterSpec(128, iv))
val decryptedBytes = cipher.doFinal(encryptedBytes)
return ByteArrayInputStream(decryptedBytes)
堆栈跟踪
E/AndroidRuntime: FATAL EXCEPTION: main
Process: onboard.app.passageways, PID: 15441
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: javax.crypto.AEADBadTagException
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:517)
at javax.crypto.Cipher.doFinal(Cipher.java:2055)
at passageways.android.onboard.services.EncryptionService.readEncryptedFile(EncryptionService.kt:79)
at passageways.android.onboard.fragments.MeetingBookDialogFragment.onViewCreated(Fragment.kt:38)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.security.KeyStoreException: Signature/MAC verification failed
at android.security.KeyStore.getKeyStoreException(KeyStore.java:839)
at android.security.keystore.KeyStoreCryptoOperationChunkedStreamer.doFinal(KeyStoreCryptoOperationChunkedStreamer.java:224)
at android.security.keystore.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer.doFinal(AndroidKeyStoreAuthenticatedAESCipherSpi.java:373)
at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineDoFinal(AndroidKeyStoreCipherSpiBase.java:506)
at javax.crypto.Cipher.doFinal(Cipher.java:2055)
at passageways.android.onboard.services.EncryptionService.readEncryptedFile(EncryptionService.kt:79)
at passageways.android.onboard.fragments.MeetingBookDialogFragment.onViewCreated(Fragment.kt:38)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:733)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
事实证明 readBytes() 使用默认缓冲区大小,并且只有 returns 字节缓冲区的长度。所以它实际上并没有以字节为单位返回整个文件,只是缓冲区的长度。
我已经切换到使用 CipherOutputStream,请务必在将内容写入标签后包含 flush() !
我遇到了同样的错误,最后我找到了答案。 当我加密(数据1)和加密(数据2)时,我想通过解密(data1.encryptStr)获取数据1,我遇到了这个问题(原因:android.security.KeyStoreException:Signature/MAC验证失败)。 所以,如果你上传 2 个文件,你无法通过解密获得第一个文件