我正在编写应用程序服务器,并决定使用AES128/CTR/NoPadding来保护连接,因为它被认为是足够安全的,无需将字节扩展到块我认为这很适合TCP,这在逻辑上是无缝的流。使用AES/CTR模拟流密码
问题是Cipher.update()直到它有一个完整的16字节块才返回加密块,因为CTR虽然模拟流密码基本上基于块密码。我应该从tcp套接字读取数据,并在它们到达时立即处理消息,但我无法检索最近的数据块,因为它仍在建立,其大小小于16个字节。而且我不能等待,因为我们不知道何时会发送下一封邮件。当然,我可以调用Cipher.doFinal()来获得剩余,但这意味着流(连接)的结束和Cipher对象将被重新初始化。
我认为这将是很好,如果有一种方法来偷看carryover。 CTR只需将纯文本与密钥流进行XOR即可,因此无论块中的其余字节如何,我都能够获得加密数据。会不会有一个很好的解决方法来解决这个问题?我正在考虑编写一个封装器,用零来加密伪造的纯文本,以便事先获得密钥流并手动进行XOR,但我不知道其他人是如何解决这个问题的。
更新
我开发一个Android应用程序,它原来,这是Dalvik虚拟机的问题。正如Robert和Monnand在下面指出的那样,Java SE至少在缺省提供程序中没有这个问题。我想我必须编写一个包装类或将模式更改为CFB8以解决此问题。 (CTR8不起作用)感谢所有的回应!
你能填充消息的长度是16的倍数吗?这将确保您始终以可解密的块结束。 – 2013-04-30 05:24:46
@Chris:感谢您的建议,这可能是一种可能的解决方法。但是,如果可能的话,我想避免这种情况,因为在网络效率方面它不是最好的,尽管它可能可以忽略不计。 – 2013-04-30 05:27:25
您可以简单地在由零组成的数组上调用它来获得密钥流。然后将其手动输入到消息中。 – CodesInChaos 2013-04-30 10:34:33