AES/CBC/PKCS5Padding 问题

2023-12-22

我正在尝试加密和解密一些简单的文本。但由于某种原因,我遇到了一个奇怪的错误:javax.crypto.BadPaddingException。为什么 JCE 会生成未正确填充的字节?

我有以下代码:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;

public class SimplestTest {
    public static void main(String[] args) throws Exception {
        SecureRandom rnd = new SecureRandom();

        String text = "Hello, my dear! ... " + System.getProperty("user.home");
        byte[] textData = text.getBytes();

        IvParameterSpec iv = new IvParameterSpec(rnd.generateSeed(16));

        KeyGenerator generator = KeyGenerator.getInstance("AES");
        generator.init(128);
        SecretKey k = generator.generateKey();

        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.ENCRYPT_MODE, k, iv);
        c.update(textData);
        byte[] data = c.doFinal();

        System.out.println("E: " + data.length);

        c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.DECRYPT_MODE, k, iv);
        c.update(data);

        System.out.println("R: " + c.doFinal().length);
    }

}

但由于某种原因它不起作用。它因以下异常而失败:

E: 16
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
        at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
        at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
        at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
        at javax.crypto.Cipher.doFinal(DashoA13*..)
        at SimplestTest.main(SimplestTest.java:31)

出了什么问题?数据大小为 16 个字节,但仍然“未正确填充”?


Cipher.update 也返回一个 byte[] 。所以当你解密时你会丢失部分加密数据。将最后一节更新如下:

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, k, iv);
byte[] someData = c.update(textData);
byte[] moreData = c.doFinal();

System.out.println("E: " + (someData.length + moreData.length));

c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, k, iv);
byte[] someDecrypted = c.update(someData);
byte[] moreDecrypted = c.doFinal(moreData);

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

AES/CBC/PKCS5Padding 问题 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 双枢轴快速排序和快速排序有什么区别?

    我以前从未见过双枢轴快速排序 是快速排序的升级版吗 双枢轴快速排序和快速排序有什么区别 我在 Java 文档中找到了这个 排序算法是双枢轴快速排序 作者 弗拉基米尔 雅罗斯拉夫斯基 乔恩 本特利和约书亚 布洛赫 这个算法 在许多数据集上提供

随机推荐

  • iOS13 通过滑动(屏幕边缘)弹出视图控制器不起作用

    有正常的UINavigationController与一些堆叠UIViewController按下后 我无法使用 屏幕边缘 滑动手势返回根视图控制器 没有自定义导航栏 没有自定义后退按钮 与使用 后退 滑动手势相关的内容是否发生了变化 我知
  • 为什么这里的外部

    我这里有一个jsfiddle https jsfiddle net Lh7qbye2 7 https jsfiddle net Lh7qbye2 7 这里还有一个测试网页 https shetline com test test01 htm
  • Rx 中立即去抖

    我正在寻找一位运营商debounce一系列的事件 比如说用户的点击 输入和输出应该是这样的 interval gt lt gt lt in 1 2 3 4 5 5 6 7 8 out 1 4 这个想法就像下划线的反跳immediate op
  • 为什么可执行文件无法接收 Makefile 中导出的变量?

    我有一个 makefile 其中导出将由可执行文件接收的变量 但令人惊讶的是可执行文件没有接收导出的值 请帮我 31 test 32 echo 33 echo Testing Electric Fence 34 echo After the
  • 套接字在进程后打开,打开完成

    在服务器端关闭客户端套接字并退出应用程序后 套接字仍会打开一段时间 我可以通过netstat看到它 Every 0 1s netstat tuplna grep 6676 tcp 0 0 127 0 0 1 6676 127 0 0 1 3
  • IIS HTTP 错误 403.1 - 禁止:执行访问被拒绝

    我有一个在 IIS 6 Windows Server 2003 上运行的 ASP NET 1 1 应用程序 这是我们的应用程序 但我们正在尝试专门复制客户的安装 以便将应用程序文件夹从他们的生产服务器完全复制到我们的测试计算机上 然后我们手
  • 查找在线/离线会员总数 Discord.js

    您好 我正在执行服务器状态命令 但我不知道如何查找总成员数在线 离线所以如果有人能帮助我那就太好了 client on message message gt if message author bot return false if mes
  • Django:在现有的 html 页面上返回 StreamingHttpResponse

    由于每个问题最好有一个问题 因此如果与问题的其他部分相似 请耐心等待另一个我的问题 https stackoverflow com questions 29921085 django passing value from form to v
  • 如何在 Silverlight/WPF 中反转裁剪几何体?

    The UIElement Clip http msdn microsoft com en us library system windows uielement clip aspx属性需要一个Geometry http msdn micr
  • 拦截 GWT RequestFactory 请求

    有没有办法在客户端拦截RequestFactory请求 我想拦截这样的调用 dummyRequest dummyOperation fire new Receiver
  • QT 安装程序框架:在简介页面之前添加新的向导页面

    我想在 QT 安装程序向导的介绍页面之前添加新页面 该页面将有图像和按钮 单击按钮后 我将导航到介绍页面 我可以这样做吗 我尝试过 但没有显示 但是 如果我将其添加到其他页面之前 例如 Target Dir 它确实会显示我的页面 有人可以在
  • 大型项目的 Visual Studio 2010 C++ 链接器性能

    在我的公司 我们仍在使用 Visual Studio 2005 但正在研究 Visual Studio 2010 希望它能加快我们开发周期的某些部分 目前 我们最感兴趣的是 Visual Studio 2010 的 C 链接器的性能 在构建
  • 拥有正确的日期时间和正确的时区

    我在用feedparser为了获取RSS数据 这是我的代码 gt gt gt import datetime gt gt gt import time gt gt gt import feedparser gt gt gt d feedpa
  • 在 TypeScript 中导入 Victor.js?

    我正在尝试使用胜利者 js http victorjs org 我在 TypeScript 项目 3 0 1 中使用了一个库 尝试导入和使用它时我真的很心痛 我已经从 npm 安装了它及其类型 victor types victor 我尝试
  • 如何获取laravel Blade中唯一的小时和分钟?

    我试图在刀片中获取小时 分钟和秒 通常我使用如下 calllog delivery date 但现在我的要求是获得小时 分钟和秒 这是我试图得到的方法 calllog delivery date gt todatestring 是的 我想我
  • 如何显示本地图像直到 NetworkImage() 在 flutter 中加载?

    new CircleAvatar backgroundColor Colors black87 backgroundImage new NetworkImage url radius 45 0 我想显示本地图像CircleAvatar直到N
  • 在 Web2py Python 中格式化日期

    我正在寻找一个函数来格式化日期以获得日 月和年 日期以以下格式存储在我的数据库中 2012 09 26 如果你的目标是在web2py模板上显示 那么你必须使用纯Python来格式化 row datetime field strftime d
  • 多选列表,每个项目都有数量选项

    我的 html 页面中有一个自由文本字段 但我想用给定的字符串填充它 假设我有字符串 apple banana 和 pineapple 现在我想要一个 添加内容 按钮来打开模式框 或者如果更简单 只需将列表嵌入到我的页面中 给我一个列表 我
  • 如何从正则表达式捕获组中修剪空格?

    正在检查的字符串类似于以下内容 注意括号之间的空格 name address zip phone number 我现在使用的表达方式 成功捕获括号内的每个文本 但它也捕获前导和尾随空格 所以我最终得到 name address zip ph
  • AES/CBC/PKCS5Padding 问题

    我正在尝试加密和解密一些简单的文本 但由于某种原因 我遇到了一个奇怪的错误 javax crypto BadPaddingException 为什么 JCE 会生成未正确填充的字节 我有以下代码 import javax crypto Ci