我正在寻找一种强大的密钥加密算法,该算法具有以下额外功能:当加密文件被损坏或篡改时,它将“大声”失败;即它会失败并告诉我它而不是生成垃圾作为解密输出。
理想情况下,它是Java的标准配置。 AES会这样做吗?
谢谢, 卡斯滕
PS>我知道我可以通过在加密文件上另外计算哈希来手动执行此操作,但我想避免这样做。
[编辑:删除“公共/私人”对我来说并不是真正必要的,并且与人们指出的不一致]
答案 0 :(得分:2)
你说你想使用公钥/私钥算法这样不对称。例如,RSA加密使用PKCS#1填充。如果您使用Cipher.getInstance("RSA")
,则此填充是默认的。如果解密失败,填充很可能会被破坏。在java中,您将获得BadPaddingException。
然而我强烈建议使用散列(即使是快速MD5)或简单的控制和。看how it is done in IPSec。 IPsec使用对称编码(DES)和HMAC(使用散列的消息验证代码) - 使用加密散列函数进行消息验证的机制。也许,如果你不需要隐藏数据,你应该只使用HMAC?
我猜你不需要加密,而是数字签名。实际上,数字签名是消息的加密(带私钥)散列。验证是对此哈希的解密和与明文消息计算的比较。
如果您提供更详细的说明,我们可以帮助您找到最佳解决方案。
答案 1 :(得分:2)
如果您想要数据的真实性,那么您可以在数据上应用MAC(消息验证码)或数字签名。
使用非对称公钥/私钥的可行解决方案是将数据包装在SignedData中,然后SignedData本身就是EnvelopedData的有效负载(参见CMS)。
如果有人篡改了内容,您的SignedData上的签名验证将会大声失败。
如果您不想涉及非对称密钥,另一种实现目标的标准化方法是使用同一RFC中描述的AuthenticatedData结构。有效载荷将是您已加密的数据,MAC还将确保完整性和真实性,如果内容被篡改,则会再次失败。
在这里使用CMS等标准的优点是a)已经存在的库已经开箱即用,并且b)您可以依赖已经过测试和分析的内容,因此您无法运行创造一些不安全的东西的风险,这些事情很容易发生在这些事情上。
答案 2 :(得分:1)
我几乎可以肯定,任何对内容敏感的加密系统(以您想要的方式)都会泄漏太多信息,无法进行良好的加密。
我们有专门的,关注特定的算法的原因是(imo)正是出于这个原因。
在(复合)纯文本中提供包含消息摘要的接口然后应用加密对您来说应该是一件小事。在解密时,你的简单包装器将寻找(固定的)n字节内容(在复合纯文本中的某处)
e.g。加密:
+--------------+----------------//----------+
| digest bytes | content (plain-text) |
+--------------+----------------//----------+
答案 3 :(得分:0)
您可能应该查看PKCS#7,它也用于S / MIME。它支持强加密和身份验证,并且可以通过许多实现库广泛使用和使用。 Bouncy Castle将是一个很好的Java选项。
答案 4 :(得分:0)
您需要使用MAC来验证数据是否已损坏或已修改。我建议你阅读this。