当前位置: 首页 > 知识库问答 >
问题:

Cipher类中的“nopadding”参数到底是做什么的?

平嘉熙
2023-03-14

Java的cipher类支持这里列出的转换。其中有几个nopadding变体:

    null

但在这种情况下,像ECB或CBC这样的分组密码模式怎么能“无填充”地使用呢?假设我们使用aes/ecb/nopadding加密一个250位的消息。明文的第一个块显然是消息的前128位。第二个明文块的最后6位是多少?

共有1个答案

饶志
2023-03-14

首先,您不能在任何模式下直接向cipher提供250位的消息。原因是像大多数运行时一样,字节是可以处理的最小数据量。如果要对250位进行编码,则必须考虑以字节为单位对这些位进行编码(例如,通过指示最后一个字节中不使用的位,就像对DER编码的ASN.1定义位字符串进行值编码一样)。

设置为1的11位DER位字符串示例:

05 FF E0

这里,最后一个字节中有5个未使用的位(它们被设置为值0)。因此,为了表明这一事实,第一个字节被简单地牺牲了--它不是值的一部分。

投掷:

 · · · ……
 · · · IllegalBlocksizeException-如果此密码是块密码,则没有请求填充(仅在加密模式下),并且该密码处理的数据的总输入长度不是块大小的倍数;或者如果这种加密算法无法处理提供的输入数据。
 · · · ...

注意,这是一个在我看来很糟糕的描述:在解密过程中,如果大小不是块大小的倍数,doFinally将抛出这个异常,而不管使用了什么填充(同样,仅用于ECB和CBC模式)。只有在分组密码和操作模式解密后才会进行解压缩。

当然,在加密期间ECB&CBC模式的输出应该始终是块大小的倍数,因此这意味着密文在解密之前被截断或以其他方式更改。

对于GCM,不需要填充(内部使用CTR模式加密),因此nopadding是唯一现实的选项,而且任何数量的数据都可以使用--但同样,cipher加密的最小元素是一个字节。尽管GCM算法是以比特而不是字节来指定的,但此实现不支持它。

 类似资料:
  • 问题内容: 这是我的代码: 这是我从解释器运行输出时的结果: 如果您注意到输出,则创建巨大的列表会消耗621.5 MB,而删除它只会释放152.6 MB。当我检查文档时,我发现以下语句: 因此,我猜想它并没有删除对象本身,而只是取消了绑定。 但是,它在解除绑定方面做了什么工作,从而释放了很大的空间(152.6 MB) 。有人可以痛苦地解释我在这里发生什么吗? 问题答案: Python是一种垃圾收集

  • 我很难理解的概念,因为根据视图,它做不同的事情。根据官方的留档,这是一个 用于根据系统窗口(如状态栏)调整视图布局的布尔内部属性。如果为true,则调整此视图的填充以为系统窗口留出空间。 现在,检查class我可以看到,当设置为时,窗口会插入(状态栏、导航栏…)应用于视图填充,该填充根据上面引用的文档工作。这是守则的相关部分: 有了新的材料设计,有了新的类别,这些类别广泛地使用了这面旗帜,这就是混

  • 问题内容: 我听说过很多有关Spring的信息,人们在网络上都说Spring是Web开发的良好框架。Spring Framework到底是做什么用的? 问题答案: 基本上,Spring是用于依赖项注入的框架,该框架是一种允许构建高度分离的系统的模式。 问题 例如,假设你需要列出系统的用户,从而声明一个名为的接口: 也许是一个访问数据库以获取所有用户的实现: 在你看来,你需要访问一个实例(仅作为示例

  • @basic(optional=false)@column(nullable=false)@basic注释将属性标记为Java对象级别的非可选属性。第二个设置,列映射上的nullable=false,只负责生成NOT NULL数据库约束。Hibernate JPA实现在任何情况下都以相同的方式对待这两个选项,因此您不妨只使用其中一个注释来实现这一目的。 我很困惑。这是什么意思-属性或变量在Java

  • 我很难理解流,以workcount为例,对于像Kafka这样的无限源,“sum”到底是做什么的? 我有点理解有时间窗的情况,因为它有开始和结束时间,对我来说就像一个“批次”,但如果没有时间窗, 什么是开始时间和结束时间