【问题标题】:How to determine the output byte[] size when using Apache Crypto?使用 Apache Crypto 时如何确定输出字节 [] 大小?
【发布时间】:2020-02-06 11:22:28
【问题描述】:

我按照下面链接中 Apache Crypto 字节数组加密/解密的示例进行操作。

https://commons.apache.org/proper/commons-crypto/xref-test/org/apache/commons/crypto/examples/CipherByteArrayExample.html

在第 54 行,它创建了一个大小为 32 的 byte[],但我不明白作者是如何得出这个数字的。我注意到它是 16 的倍数,这是第 40 行的密钥大小。如果是这个原因,为什么不是 64、128 等等...

【问题讨论】:

  • 这听起来可能很奇怪,但您也可以问作者,而不是在这里问 why 答案。我们甚至有一位著名的密码学家或 2 位密码学家在密码问答网站上回答!因为最终我们只能创造逻辑推理,不幸的是,why并不总是合乎逻辑的。

标签: java cryptography


【解决方案1】:

看起来CryptoCipherCipher 实例的部分镜像。使用Cipher实例需要Apache实现provider,而要使用Cipher服务,provider需要签名。因此,使用具有大致相同 API 的不同类来轻松地在签名和未签名代码之间切换是有意义的。

顺便说一句,CryptoCipher 似乎缺少一个名为 Cipher#getOutputSize 的方法。该方法用于检索输入明文的最小缓冲区大小。所以基本上,他们似乎已经指定了一个缓冲区大小,对于大约 12 字节的输入字符串来说绝对足够大。然后他们稍后使用Arrays.copyOf(output, updateBytes+finalBytes) 调整它的大小(对于ECB 或CBC 模式,这可能会导致16 个字节)。


顺便说一句,这个例子是一段废话,我对这个库没有任何期望。查看它并了解这不是执行加密的方式。密钥和 IV 不是字符串,IV 应该是随机的,并且包含在密文中。我什至不会介绍绝对没有什么特别之处的单一实用方法getUTF8String。资源尝试在哪里?为什么CryptoCipher 缺少必要的方法?

【讨论】:

  • 我确实看过java.crypto 并注意到他们有getOutputSize。但我想了解 apache 库试图完成的工作,并且您对您的评论有所帮助。
  • 好吧,我没有安装 lib,但是应该很容易检查你是否确实得到了 16 字节的输出。我希望它构成一个答案。很抱歉最后的咆哮,但这样的例子真的让我很紧张;你不应该从一个加密库的例子中学到不好的加密。它比这里发布的许多代码片段还要糟糕……好吧,是的。
猜你喜欢
  • 2012-04-09
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多