我正在寻找一种简单的方法,使用InputStream / OutputStreams计算Java中的密文(加密 - 然后MAC,包括IV和算法参数)的HMAC。
尝试失败:我首先尝试从CipherOutputStream继承,但是它们不允许在编写密文之后以编程方式检索密文 - 这使我得出结论:使用CipherOutputStream只能实现MAC-then-encrypt 。代码在这里:http://pastebin.com/armvDN3N
成功尝试:然后我使用CipherOutputStream的OpenJDK7源代码作为实现CipherHmacOutputStream类的基础,该类在调用write()时更新Hmac(mac.update())并将其附加到流当关闭时被调用。代码在这里:http://pastebin.com/fF8WFBpA
现在的问题是,当我尝试编写匹配的CipherHmacInputStream 时,没有明显的方法来判断HMAC何时开始,因为无法判断流何时结束。 available()方法仅返回缓冲区中的“新”解密字节。结果,解密(cipher.update())可能错误地尝试解密HMAC。我已经在这方面投入了一些时间,但必须有一种更简单的方法来使用HMAC进行基于流的加密/解密。 GCM / EAX是明显的答案,但我想让算法/模式可配置,并且如果不使用GCM / EAX,还提供消息认证。
你有什么想法吗?有没有标准方法可以做到这一点?
答案 0 :(得分:1)
您将两段数据烘焙成序列化形式。您将不得不使用某种类型的标头存储长度,以便您可以稍后隔离每个标头。在您使用它时,请在数据报中添加一个版本,以便将来可以保持向后兼容性。