我的团队需要开发一个解决方案,在用Java编写的Android应用程序的上下文中加密二进制数据(存储为byte[])。加密的数据将以各种方式传输和存储,在此期间不能排除数据损坏的可能。最终,另一个Android应用程序(同样是用Java编写的)将不得不解密数据。
已经确定加密算法必须是AES,密钥为256位。然而,我想对我们应该使用的AES实现和/或“模式”做出一个明智的决定。我读过一些叫做GCM模式的文章,我们用它做了一些测试(使用Bouncy城堡/Spongy城堡),但我并不完全清楚AES-GCM到底是为了什么,和普通AES相比,它“买”了我们什么,以及是否有任何交易需要考虑。
以下是我们所关注的问题/要求/问题的清单:
javax.crypto.Cipher提供的)不会这样做,但最初的测试表明是这样的。因此,我猜想填充需求本身并不是求助于类似GCM的理由,而不是“普通”的AES。对吗?预先感谢您的任何建议、澄清和/或代码示例。
编辑: delnan很有帮助地指出,没有“普通AES”这样的东西。因此,为了澄清,我的意思是使用Java的内置AES支持。
就像这样:Cipher localCipher = Cipher.getInstance("AES");
发布于 2012-11-16 18:26:36
2012年的答案是GCM,除非你有严重的兼容性问题。
GCM是一种经过验证的加密模式。它一次性为您提供机密性(加密)、完整性和身份验证(MAC)。
到目前为止,正常的操作模式是欧洲央行(这是Java的默认模式)、CBC、CTR、OFB和其他几种模式。他们都只提供加密。保密本身很少有用,但没有完整性;一个人必须结合这样的经典模式和完整性检查以一种临时的方式。由于密码学很难正确,这种组合常常是不安全的,速度慢于必要,甚至两者兼而有之。
通过身份验证的加密模式(最近)已经由密码家创建,以解决这个问题。GCM是最成功的方法之一:它已经被NIST选中,它是高效的,它是免费的,并且它可以携带额外的认证数据(即保持清晰的数据,但您可以验证其真实性)。有关其他模式的说明,请参见这篇关于马修·格林的优秀文章。
来谈谈你的关切:
尽管如此,人们必须意识到,GCM安全依赖于良好的随机数生成来创建IV。
https://stackoverflow.com/questions/13420065
复制相似问题