我正在加密通过蓝牙服务在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
的返回值来返回可以读取的字节总数:
返回下一个调用此输入流方法可从此输入流读取(或跳过)的剩余字节数的estimate 无阻塞。
对于同一系统上的文件,从某种意义上说,这始终是“剩余”到文件末尾的字节数。但是,对于其他流,available
主要提示您应请求多少个字节。对于解密,available()
可以简单地返回解密后已经可用的字节数。可能是密文仅应要求解密,因此返回0。
对于特定密码,由于纯文本需要unpadding(ECB / CBC)或authentication tag]的验证和删除,因此确定流的末尾是否还很困难。 。这可能会使available
的计算复杂化。 API实现可能只是决定总是简单地返回0
(这意味着对read
may always block的调用)。
我创建了提到的类,以使用AES执行文件加密和解密,下面是代码。我已将文件转换为字节数组并对其执行加密,然后再次使用file对其解密并从函数中返回字节。