Android上加密图像的对称加密和非对称加密的区别

4
我正在尝试创建一个在移动设备上实时加密并写入存储的Android应用程序。已经实现了不进行加密的应用,查看了100多个在stackoverflow上的加密示例/帖子,但是无法确定使用哪种方法。
一开始考虑使用AES,并进行了一些谷歌搜索以找出其安全性。每次输入16或32个字符(更好的安全性)的密码似乎不太方便。作为替代,考虑使用非对称加密。使用一个密钥进行加密,使用另一个密钥进行解密,这样我可以将用于加密的密钥留在内存中,并仅在需要解密数据时(如在PC上离线或另一个应用程序中)使用另一个密钥。
将加密的文件大多数是图片、视频、音频录音和办公文档。
第二种方法是否存在漏洞?在AES和RSA之间,如果需要平衡速度和安全性,哪个更好?数据并不是绝对机密,只需要防止落入错误的手中。设备没有加密,运行KitKat。这两种方法对某种攻击有哪些效果?
编辑:描述了两种方法。
方法1:使用基于密码的AES加密,在应用程序启动时手动输入16/32个字符的密码,在一段时间后/从内存中清除密码。需要时再次输入密码。
方法2:使用基于私钥/公钥的RSA加密。将一个用于加密的密钥留在设备上。在解密时使用另一个密钥,这是很少执行的操作。
1个回答

3

由于您并没有描述任何方法,而只是提到了两种加密算法,因此这个问题有些难以回答。如果实现得当,这两种算法都足以满足您的需求。

请记住,RSA 只能加密长度不超过其密钥长度(减去一些填充)的数据,因此在大多数情况下,仅使用 RSA 是不够的。

如果您只是在单个设备上加密信息,并希望用户控制何时进行加密和解密,例如使用密码,则可以使用 PBKDF2 以密码字符串为输入派生长度为 x 的密钥(例如,对于 AES256,32 字节)。

如果您不打算利用 RSA 的非对称特性,则不必使用 RSA。在大多数情况下(但不是全部情况),如果没有服务器或其他附加方参与,RSA 是多余的。

虽然您没有详细描述您的问题,但如果我是您,我会使用 AES。

使用 AES 时,请记住以下事项:

  • 永远不要使用 ECB 模式。
  • 永远不要使用纯 ASCII 字节作为密钥。您应该使用 PBKDF2 或类似方法来派生密钥,通常使用 100,000 轮即可。
  • 始终使用安全的随机数生成器来创建您的 IV(如果您的密码模式使用 IV,则有些密码模式(例如 CTR)使用 nonce,但概念基本相同)。
  • 永远不要忘记 AES 不能确保完整性。在解密之前使用 MAC 检测密文中的更改。

@ Luke Park:感谢您的回答。我使用了AES/CBC/PKCS5Padding和PBKDF2WithHmacSHA1实现了256位密钥和1000轮加密,对于一个5MB的文件只需要不到2秒的时间。需要整理代码/逻辑/流程并进行精确测量。 - Raghav Pete
@RaghavPete 很高兴你已经解决了问题。然而,现在的 PBKDF2 算法需要更多的轮数,1000 轮已经远远不够了。现在,你应该至少使用 ~100,000 轮的加密方式。 - Luke Joshua Park
@Luke Park: 我计划进行10,000轮。需要看看进行额外轮次需要多少额外时间。 - Raghav Pete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接