我正在寻找一种简单的方法,使用 InputStream/OutputStreams 在 Java 中的密文(加密然后 MAC,包括 IV 和算法参数)上计算 HMAC。
尝试失败:我首先尝试从 CipherOutputStream 继承,但在密文编写完成后,他们不允许以编程方式检索密文——这让我得出结论,只能使用 CipherOutputStream 实现 MAC-then-encrypt 。代码在这里: http: //pastebin.com/armvDN3N
成功尝试:然后我使用 CipherOutputStream 的 OpenJDK7 源代码作为实现 CipherHmacOutputStream 类的基础,该类在调用 write() 时更新 Hmac (mac.update()),并在调用 close 时将其附加到流中。代码在这里: http: //pastebin.com/fF8WFBpA
现在的问题是,当我尝试编写匹配的 CipherHmacInputStream时,没有明显的方法可以判断 HMAC 何时开始,因为无法判断流何时结束。available() 方法仅返回缓冲区中的“新”解密字节。因此,解密 (cipher.update()) 可能会错误地尝试解密 HMAC。我已经在这方面投入了一些时间,但是必须有一种更简单的方法来使用 HMAC 进行基于流的加密/解密。GCM/EAX 是显而易见的答案,但我想保留可配置的算法/模式,如果不使用 GCM/EAX,还提供消息身份验证。
你有什么想法?有没有标准的方法来做到这一点?