- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Java 的 Cipher
类支持转换 listed there 。其中有几个 NoPadding
变体:
我首先假设这里的“填充”是指用于填充最后一个明文 block 的方法,如果明文的大小不是密码 block 大小的倍数。
但在这种情况下,如何才能在“无填充”的情况下使用 ECB 或 CBC 等分组密码模式呢?假设我们使用 AES/ECB/NoPadding 来加密 250 位消息。明文的第一个 block 显然是消息的前 128 位。第二个明文 block 的最后 6 位是多少?
最佳答案
嗯,首先,你不能喂Cipher
- 在任何模式下 - 直接发送 250 位消息。原因是 - 就像在大多数运行时一样 - 字节是您可以处理的最小数据量。如果要编码 250 位,则必须考虑以字节为单位对这些位进行编码(例如,通过指示最终字节中不使用的位,如对 DER 编码的 ASN.1 的值编码所执行的那样)定义的位串)。
DER BIT STRING 仅 11 位设置为 1 的示例:
05 FF E0
这里最后一个字节中有 5 个未使用的位(设置为值 0
)。因此,只是牺牲第一个字节来表明这一事实 - 它不是值的一部分。
其次,即使输入是 8 位的倍数,您仍然无法使用NoPadding
进行加密。对于 ECB 或 CBC 模式除非输入本身已经是 block 大小的倍数。如果指定NoPadding
那么确实没有添加任何字节(甚至没有 00
有值(value)的字节),所以你会得到一个 IllegalBlockSizeException
如果明文大小不是 block 大小的倍数(AES 为 16 字节,DES 和 DES-EDE 为 8 字节)。
明文大小是提供给update
的输入字节数。和doFinal
方法在一起。最后一个 block 之前的 block 的字节将在需要时进行缓冲 - 只有最终计数很重要。
来自Cipher#doFinal
文档:
throws:
...
IllegalBlockSizeException
- if this cipher is a block cipher, no padding has been requested (only in encryption mode), and the total input length of the data processed by this cipher is not a multiple of block size; or if this encryption algorithm is unable to process the input data provided.
...
请注意,在我看来,这是一个糟糕的描述:在解密过程中,doFinal
将抛出此异常。如果大小不是 block 大小的倍数,则无论使用什么填充(同样,仅适用于 ECB 和 CBC 模式)。毕竟,填充仅在通过分组密码和操作模式解密后才会发生。
当然,加密期间 ECB 和 CBC 模式的输出应始终是 block 大小的倍数,因此这意味着密文在解密之前被截断或以其他方式更改。
<小时/>对于GCM来说不需要padding(内部使用了CTR模式加密),所以NoPadding
是唯一现实的选择,任何数量的数据都可以 - 但同样是由 Cipher
加密的最小元素是一个字节。尽管 GCM 算法是以位而不是字节为单位指定的,但此实现并不支持它。
关于java - "NoPadding"参数在 Cipher 类中到底有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59923645/
使用 Cipher.ENCRYPT_MODE 有什么区别/好处/缺点吗加密 key 以使用 Cipher.WRAP_MODE 进行传输? 我的理解是,我仍然需要第二个,可能更小的 key 来包装/加密
我创建了一个传递两个缓冲区的密码。 buf1 是它们的键,一个 32 字节的缓冲区,而 buf2,即 IV,也是一个 32 字节的缓冲区,我将其切片为仅使用 16 字节。文档说 cipher.upda
我刚刚将我的 Mac 升级到 Snow Leopard,并启动并运行了我的 Rails 环境。除了 OSX 之外,我之前安装的唯一区别是我现在运行的是 ruby 1.8.7 (2008-08-11 p
正在尝试在客户端和服务器之间建立 SSL 连接。但每当我尝试从客户端连接时,我的服务器上都会收到 javax.net.ssl.SSLHandshakeException: no cipher suit
在多线程 Java 应用程序中,我们使用 AES-256 对磁盘文件进行加密和解密。请注意,多个线程可以同时调用不同文件的加密和解密方法。 加密: Cipher encrypter = Cipher.
我试图将安全提供程序从 SunJCE 切换到 Bouncy CaSTLe (BC),并在 Cipher 对象中偶然发现了这种特殊行为。据我所知,SunJCE 的 cipher.update(bytes
我应该如何使用从服务器端传输的公钥在客户端加密 session key ? 我应该使用 Cipher.WRAP_MODE 还是 Cipher.ENCRYPT_MODE? Cipher cipher =
SecretKey key = keyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS
我正在尝试使用 AES 解密字符串,并且使用 jce.jar 来执行此操作。 我有以下方法来解密。 public String decrypt(String strToDecrypt) {
我有一个带有解密功能的 Android 应用程序,如下所示: private static byte[] decrypt(byte[] keybytes, byte[] data) { Sec
我正在实现 DES - CBC。我对 cipher.init 、 cipher.update 和 cipher.dofinal 的作用感到困惑。我只是使用 init 来设置 key 并使用 dofin
使用 Digicert's SSL mechanism explanation我已经了解数据在浏览器和服务器之间是如何加密的,以下是我的理解。 浏览器将向服务器发送请求以获取一些资源。服务器检查请求的
我正在使用 javax.crypto 在 java 中进行 AES CBC 解密。我正在使用以下 Cipher 类方法: public final void init (int opmode, Key
我能否在多个方法中使用相同的 Cipher 对象,因为 getInstance 和 init 的方法参数不会改变? 例如,假设应用程序的多个部分使用实用程序类中的 decrypt 方法。所有传递的加密
很简单,javax.crypto.Cipher 的一个实例(例如 Cipher.getInstance("RSA"))可以从多个线程中使用,还是我需要将它们中的多个粘贴在 ThreadLocal 中(
Rails4默认使用加密的cookie session 存储。当应用程序尝试加密cookie时,会引发以下错误:OpenSSL::Cipher::CipherError: Illegal key si
我正在使用this code . 当所有代码都在 main 方法中的一个 try catch 中时,它似乎可以工作,但当它被分成另一个类并通过 Security 对象调用解密时,它就不起作用了。 我猜
我目前正在使用 Cipher 创建一个使用始终相同的 key 的解决方案。我知道这不是最安全的解决方案,但这是我被要求做的。我应该使用 AES256 和 EBC,但我无法正确加密。问题是我有未知的字符
我正在尝试读取一个大小为1KB的文件,然后使用CBC模式下的AES算法对其进行加密和解密。当我尝试初始化密码时,它抛出一个错误。请找到下面的代码。我在密码类中找不到接受“加密模式”、“ key ”和类
你好,我构建了这两种方法,加密工作正常,但解密出现错误,因为密码想要一个字节,我想从字符串加密 import javax.crypto.Cipher; import javax.crypto.spec
我是一名优秀的程序员,十分优秀!