AES 应该使用什么样的填充?

2024-01-14

我已经实现了 AES 加密(作业),但我偶然发现了填充消息的问题。

如果我的消息是这样的字节数组:

public byte[] encrypt(byte[] message) {
    int size = (int) Math.ceil(message.length / 16.0);
    byte[] result = new byte[size * 16];
    for (int i = 0; i < size; i++) {
        if ((i+1) * 16 > message.length){
            //padding here????
        } else {
            byte[] block = Arrays.copyOfRange(message, i * 16, (i + 1) * 16);
            byte[] encryptedBlock = encryptBlock(block);                
            System.arraycopy(encryptedBlock, 0, result, i*16, 16);
        }
    }
    return result;
}

我怎样才能填充这样的消息?

我无法使用零填充,因为每个字节都可能为零,并且它可能会影响带有尾随零的此类消息。

我找不到任何关于这是如何完成的参考here http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf(描述AES加密的论文)


您可以使用多种方法,从简单到高级。 Bruce Schneier 建议两种相当简单的方法:

一种是用 n 个字节填充最后一个块,所有字节的值均为 n,这是 Alex Wien 所建议的。这存在问题(包括限制块大小小于 256 字节长)。这种填充模式称为 PKCS#7 填充(对于 16 字节块)或 PKCS#5 填充(对于 8 字节块)。

另一种方法是附加一个值为 0x80 的字节(二进制值为 1000 0000 的字节),后跟填充最后一个块所需的多个零字节。这种方法称为 ISO 填充,是 ISO/IEC 9797-1 填充方法 2 的缩写。填充本身是位级填充,添加值为 1 的单个位,然后添加值为 0 的位,直到到达块尺寸。

至于如何知道一条消息是否被填充,答案是消息会always填充:即使消息的最后一个块完全适合块内(即消息的大小是块大小的倍数),您也必须添加一个虚拟的最后一个块。

如果您有兴趣研究一些更高级的方法,请在维基百科上查找一种称为密文窃取的技术:http://en.wikipedia.org/wiki/Ciphertext_stealing http://en.wikipedia.org/wiki/Ciphertext_stealing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AES 应该使用什么样的填充? 的相关文章

  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 按第一列排序二维数组,然后按第二列排序

    int arrs 1 100 11 22 1 11 2 12 Arrays sort arrs a b gt a 0 b 0 上面的数组已排序为 1 100 1 11 2 12 11 22 我希望它们按以下方式排序a 0 b 0 首先 如果
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 如何模拟从抽象类继承的受保护子类方法?

    如何使用 Mockito 或 PowerMock 模拟由子类实现但从抽象超类继承的受保护方法 换句话说 我想在模拟 doSomethingElse 的同时测试 doSomething 方法 抽象超类 public abstract clas
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • hibernate锁等待超时超时;

    我正在使用 Hibernate 尝试模拟对数据库中同一行的 2 个并发更新 编辑 我将 em1 getTransaction commit 移至 em1 flush 之后我没有收到任何 StaleObjectException 两个事务已成
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 普罗米修斯指标 - 未找到

    我有 Spring Boot 应用程序 并且正在使用 vertx 我想监控服务和 jvm 为此我选择了 Prometheus 这是我的监控配置类 Configuration public class MonitoringConfig Bea
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • 如何知道抛出了哪个异常

    我正在对我们的代码库进行审查 有很多这样的陈述 try doSomething catch Exception e 但我想要一种方法来知道 doSomething 抛出了哪个异常 在 doSomething 的实现中没有 throw 语句
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • android.app.Application 子类,onTerminate 未被调用

    从文档中android app Application 那些需要维护全局应用程序状态的基类 我正在使用自己的子类来维护一个用于查询服务器的对象 还来自文档 onTerminate 当应用程序停止时调用 然而 onTerminate 在我的班
  • Entity Framework Core 2.0 删除记录而不是更新记录

    我认为这可能是一个错误 但我认为我可能缺少一些可以解释该行为的东西 任何帮助 将不胜感激 Technical details EF Core version Microsoft EntityFrameworkCore 2 0 1 Datab
  • 工厂女孩什么时候在数据库中创建对象?

    我正在尝试使用模拟会话FactoryGirl shoulda 它可以与固定装置配合使用 但我在使用工厂时遇到问题 我有以下工厂 用户登录名和电子邮件都有unique验证 Factory define user do u u login qu
  • 将多种内容类型发布到 Web api

    我有一个 Web api 我想发布一个图像文件 一些数据 以便在服务器收到它时正确处理它 调用代码看起来像这样 using var client new HttpClient using var content new MultipartF
  • java nio 否定 glob 模式

    fileSystem getPathMatcher glob pattern matches path getFileName 我想匹配所有不匹配 ts 的内容 java 中 glob 的语法是什么 在有人建议我使用正则表达式之前 我需要使
  • 将现有私钥导入 BKS Keystore

    我有一个由 openssl 按以下方式生成的密钥对 openssl genrsa out private key pem 2048 我将其转换为 DER 格式如下 openssl pkcs8 topk8 inform PEM outform
  • 使用 BroadcastReceiver 关闭 Activity

    我的应用程序中有一个活动 Main java 打开 我想使用广播接收器关闭该活动 如何关闭该活动 首先 您的 Main java 需要注册为接收器 您可以在 Main java 的 onResume 中注册它 Override public
  • 将网站图标添加到网站[重复]

    这个问题在这里已经有答案了 可能的重复 HTML 标题图像 https stackoverflow com questions 3103490 html title image 有人可以告诉我如何让图标出现在 PHP 的浏览器选项卡上吗 我
  • 应用商店提交错误无效的捆绑结构

    当我尝试提交之前成功提交的应用程序版本升级时 我从 XCode 8 1 收到以下错误 错误 ITMS 90171 无效的捆绑包结构 不允许使用二进制文件 Particle app Particle armv7 除了受支持捆绑包的 CFBun
  • 如何在用户键入时获取 JTextField 内容的长度?

    JTextField 有一个 keyTyped 事件 但似乎在它触发时单元格的内容尚未更改 因此 如果在这里阅读 length 总是错误的 必须有一种简单的方法来获取用户在击键后显示的长度 这可能不是最佳方式 并且已经有一段时间了 但在过去
  • 单击 div 外部 - 当 div 具有触发事件的按钮时 - angularjs

    我使用以下指令来检测何时在 div 外部进行点击 app directive clickOut function window parse return restrict A link function scope element attr
  • 其他属性的 Maven 密码加密

    我想使用 Maven 的密码加密 例如它用于 Mojo 属性的节点 我尝试将加密密码粘贴到 mojo 的正确属性中 但它将其视为纯文本 我曾是hoping我可以在 Mojo 属性的注释上设置一个属性 该属性可以解释它可以被加密 如果可以 则
  • 如何从 C# 更新文件的更改时间?

    文件可以有更改日期 该日期与上次修改日期或上次访问日期不同 更改日期通过 UI 或 NET API 不可见 有两个 Win32 函数通过HandleEx获取文件信息 http msdn microsoft com en us library
  • 如何从不同的进程向 GUI 中的槽发出信号?

    语境 在 Python 中 主线程生成第二个进程 使用多处理模块 然后启动 GUI 使用 PyQt4 此时主线程会阻塞 直到 GUI 关闭 第二个进程始终处于处理状态 理想情况下应以异步方式向 GUI 中的特定插槽发出信号 问题 Pytho
  • 从高山图像中捕获 SIGTERM

    我试图从 docker 实例捕获 SIGTERM 信号 基本上是在调用 docker stop 时 但找不到方法 因为我执行的每次尝试都有不同的结果 以下是我的设置 Dockerfile FROM gitlab gitlab runner
  • Jasper 报告空白带仍然占用空间

    我的问题是 即使该行是空白的 它仍然占用带子高度的空间 因此在下一个带子之前有比平常更大的间隙 我的 jasper 文件中的乐队如下所示
  • 使用 Delphi Tokyo 10.2 通过 GetObjectProp 获取 TextSettings.Font.Style 属性

    我使用Delphi的GetObjectProp函数来获取表单组件的属性 我获取了几个组件的所有属性 但是我无法获取TLabel等组件的TextSettings Font Style 粗体 斜体 属性例如 我需要知道组件文本是粗体还是斜体 我
  • .NET 4 缓存支持

    我了解 NET 4 Framework 内置了缓存支持 有谁有这方面的经验 或者可以提供良好的资源来了解更多信息 我指的是内存中对象 主要是实体 的缓存 以及可能使用 System Runtime Caching 我假设你正在接近this
  • 使用原点位于中心的椭圆 WPF

    我有一个可以拖动 旋转和调整大小的程序System Windows Shapes Ellipse in a Canvas panel 要调整椭圆的大小并将其拖动到画布内并始终保持其居中 我需要每次纠正其原点 因为椭圆的原点位于左上角 有办法
  • AES 应该使用什么样的填充?

    我已经实现了 AES 加密 作业 但我偶然发现了填充消息的问题 如果我的消息是这样的字节数组 public byte encrypt byte message int size int Math ceil message length 16