android - 在 Android 上解密使用 EncryptedFile 加密的文件时出现问题
问题描述
我正在加密在蓝牙服务中的 android 应用程序上创建的文件。稍后在另一堂课中,我想解密此文件并将其上传到服务器。
对于加密,我使用的是 AndroidX androidx.security:security-crypto:1.0.0-alpha02 库,它是 Tink 的包装器。我已经阅读了所有可以找到的有关 EncryptedFile、EncryptedFile.Builder 等的开发人员文档和教程。
我加密文件如下:
String keySetAlias = "BilboBaggins";
String keySetPref = "Hobbits";
EncryptedFile m_StudyChannelEncryptedFile = new EncryptedFile.Builder(
filePath,
getApplicationContext(),
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB).setKeysetAlias(keySetAlias).setKeysetPrefName(keySetPref).build();
m_output = m_StudyChannelEncryptedFile.openFileOutput();
从这里我可以像普通的 FileOutputStream 一样写入文件,通过查看写入手机存储的数据,我可以确认它是加密的。
在上传之前,我尝试在另一个类中做同样的事情,然后解密它。
String masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
String keySetAlias = "BilboBaggins";
String keySetPref = "Hobbits";
EncryptedFile encryptedFile = new EncryptedFile.Builder(
filePath,
getApplicationContext(),
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB).setKeysetAlias(keySetAlias).setKeysetPrefName(keySetPref).build();
// Read channel data file
FileInputStream fChannel = encryptedFile.openFileInput();
m_Dat1Size = fChannel.available();
从这里开始,问题是我得到的文件的可用大小为零 - 就像它不存在一样。我可以确认写入的原始数据没有被覆盖,因为手机存储上的文件仍然有加密数据。
我相信,通过为其提供位置 keySetAlias、keySetPref,EncryptedFile 构建器应该能够初始化一个具有正确密钥的 EncryptedFile 实例。
我将不胜感激任何帮助或见解!
谢谢你,迈克尔
解决方案
例如,不能依靠InputStream
返回值来返回可以读取的字节总数:available
返回可以从此输入流中读取(或跳过)的剩余字节数的估计值,而不会被下一次调用此输入流的方法阻塞。
对于同一系统上的文件,这总是“剩余”到文件末尾的字节数是有道理的。但是,对于其他流available
,主要是关于您应该请求多少字节的提示。对于解密,available()
可以简单地返回解密后已经可用的字节数。很可能密文仅在请求时才被解密,因此它返回 0。
对于特定密码,由于明文需要取消填充(ECB/CBC) 或验证和删除身份验证标签(GCM) ,确定是否到达流的末尾也可能很棘手。这可能会使 的计算复杂化available
。API 实现可能只是决定简单地返回0
always(这意味着调用read
可能总是阻塞)。
推荐阅读
- python - 如何使用seaborn绘制彼此相邻的独立图?
- c++ - 为什么 sscanf 不能从一个字符串中读取 uint64_t 和 char?
- angular - 在使用 Angular 5 在 AWS s3 中创建存储桶时设置 CORS
- java - replaceAll 粘贴部分不必要的额外字符串
- sql-server - 如何在 MS Access 和 SQL Server 上获得相同的 UPDATE 查询结果
- hash - 使用链接方法调整哈希表的大小
- fxruby - 无法加载此类文件——fedora eclipse 上的 fox16 (LoadError) 错误
- c# - Unity - Sprite 未正确加载
- logic - 如何找到逻辑真值表的输入数量?
- vb.net - 循环遍历 LINQ 结果