javax.crypto.BadPaddingException:解密时给定最终块未正确填充错误

2024-02-14

我正在按如下方式对数据进行加密和解密,但出现错误

protected Cipher aes_Gen_with_Key(byte[] key)
    {
        Cipher cipher=null;
        try
        {
        byte[] key_hash = (key).toString().getBytes("UTF-8");
        key_hash = Arrays.copyOf(key_hash, 32); // use only first 256 bit
        SecretKeySpec secretKeySpec = new SecretKeySpec(key_hash, "AES"); 
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

        } catch (Exception e) {
            System.out.println("Error Occured");
        }
        return cipher;
    }

    protected Cipher aes_Dec_with_Key(byte[] key,byte[] iv)
    {
        Cipher cipher=null;
        try
        {
        byte[] key_hash = (key).toString().getBytes("UTF-8");
        key_hash = Arrays.copyOf(key_hash, 32); // use only first 256 bit
        SecretKeySpec secretKeySpec = new SecretKeySpec(key_hash, "AES");
        cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE,secretKeySpec,new IvParameterSpec(iv));
        }
        catch (Exception e) {
            System.out.println(e);
        }

        return cipher;
    }

通过上述 2 个函数,我得到了用于加密和解密的密码,但得到了 javax.crypto.BadPaddingException: 鉴于最终块未正确填充错误。解密字节数组的长度为752,解密时的IV为16字节长。有人可以建议吗?

这里有一些更相关的代码块。 对于无效使用 java 命名约定表示歉意

   // Key Class
    import java.io.Serializable;
    @SuppressWarnings("serial")
    public class Key implements Serializable{
        byte[] gsmodp_hash=null;
        byte[] iv_pass=null;
        byte[] Nonce_Enc=null;
        byte[] iv_non=null;
        public Key() {
        }

        public Key(byte[] gsmodp_hash,byte[] iv_pass,byte[] Nonce_Enc,byte[] iv_non) {
            this.gsmodp_hash=gsmodp_hash;
            this.iv_pass=iv_pass;
            this.Nonce_Enc=Nonce_Enc;
            this.iv_non=iv_non;
        }
    }

    // Client side code

            JSONObject auth_step_obj=new JSONObject();
            try {

                BigInteger gsmodp=get_modu_frm_server(receivePacket);
                BigInteger R2=get_R2_frm_server(receivePacket);
                BigInteger N2=get_N2_frm_server(receivePacket);
                N2=crypto.dec_NonceG(N2);
                BigInteger a=crypto.get_RandLong();
                BigInteger gamodp= crypto.dh_GenerationG(a, crypto.g, crypto.p);
                BigInteger key=crypto.dh_GenerationG(a, gsmodp, crypto.p);

                // Got hash of g^abmodp

                byte[] dhkey=crypto.sha256G(key.toString());
                key=null;
                //Mixing passwords

                SecretKey secretkey=(SecretKey) userCredentials.get("password");
                byte[] mixed_hash=crypto.passwordMixerG(R2, secretkey.getEncoded());

                //Working Fine Till now
                // Getting Cipher for encrypting gsmodp using password and nonce
                Cipher cipher_password=crypto.aes_Gen_with_Key(mixed_hash);
                Cipher cipher_key=crypto.aes_Gen_with_Key(dhkey);

                // Generating quantities for JSON Object        
                byte[] gsmodp_hash=cipher_password.doFinal(gamodp.toString().getBytes());
                byte[] gsmodp_hash_iv=cipher_password.getIV();
                byte[] nonce_enc=cipher_key.doFinal(N2.toString().getBytes());
                byte[] nonce_enc_iv=cipher_key.getIV();
                Key authetication_parameters=new Key(gsmodp_hash,gsmodp_hash_iv,nonce_enc,nonce_enc_iv);
                auth_step_obj.put("obj",authetication_parameters);

            } catch (Exception e) {
                // TODO Auto-generated catch block
                System.out.println("Hi:sec_DH_Step");
            } 
            // This sends JSONObject to calling method which generates UDP packet and sends to server 
            return auth_step_obj;
        }

    // Server side code
    // Once packet received on server following happens
    ds.receive(receivePacket);
    SecretKey userKey=cryptoObj.get_from_KeyStoreG(user_name);
    // Adding R2 and userKey byte by byte
    byte[] mixed_hash=cryptoObj.passwordMixerG(R2, userKey.getEncoded());
    JSONObject authentication_nonce=new JSONObject();
    authentication_nonce=cryptoObj.readRecievedPacket(receivePacket);
    Key obj=(Key)authentication_nonce.get("obj");
    Cipher cipher=cryptoObj.aes_Dec_with_Key(mixed_hash,obj.iv_pass);
    // I am getting error on do final
    System.out.println(new String(cipher.doFinal(obj.gsmodp_hash)));

您提供的代码工作得很好。错误一定存在于您未与我们共享的代码中(即实际使用Cipher对象)。

我编写了下面的代码来测试您的问题代码:

public static void main(String[] args) throws Exception {

  Random random = new Random();
  byte[] key = new byte[32];
  random.nextBytes(key);

  byte[] plaintext = new byte[100];
  random.nextBytes(plaintext);

  Cipher enc = aes_Gen_with_Key(key);

  byte[] ciphertext = enc.doFinal(plaintext);
  byte[] iv = enc.getIV();

  Cipher dec = aes_Dec_with_Key(key, iv);

  byte[] recoveredPlaintext = dec.doFinal(ciphertext);

  System.out.println(Arrays.equals(plaintext, recoveredPlaintext));    
}

注意,我将你的两个方法设为静态。您应该这样做,因为它们不使用任何实例变量。

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

javax.crypto.BadPaddingException:解密时给定最终块未正确填充错误 的相关文章

  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • HAProxy SSL终止+客户端证书验证+curl/java客户端

    我希望使用我自己的自签名证书在 HAProxy 上进行 SSL 终止 并使用我创建的客户端证书验证客户端访问 我通过以下方式创建服务器 也是 CA 证书 openssl genrsa out ca key 1024 openssl req
  • 如何将jscrollpane添加到jframe?

    我有以下源代码 有人可以给我建议如何将 jscrollpane 添加到 jframe 上吗 我尝试了几次将其添加到 jframe 但没有任何进展 它甚至没有显示 public class Form3 JFrame jframe new JF
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Karaf / Maven - 无法解决:缺少需求 osgi.wiring.package

    我无法在 Karaf 版本 3 0 1 中启动捆绑包 该包是使用 Maven 构建的并导入gson http mvnrepository com artifact com google code gson gson 2 3 1 我按照要求将
  • 启用 TLSv1.2 和 TLS_RSA_WITH_AES_256_CBC_SHA256 密码套件

    Server TLS Version v1 2 Cipher Suite TLS RSA WITH AES 256 CBC SHA256 Client JRE 1 7 当我尝试直接通过 SSL 从客户端连接到服务器时 收到以下错误 Caus
  • 如何处理 StaleElementReferenceException

    我正在为鼠标悬停工作 我想通过使用 for 循环单击每个链接来测试所有链接的工作条件 在我的程序中 迭代进行一次 而对于下一次迭代 它不起作用并显示 StaleElementReferenceException 如果需要 请修改代码 pub
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • 源值 1.5 的错误已过时,将在未来版本中删除

    我使用 scala maven plugin 来编译包含 scala 和 java 代码的项目 我已经将源和目标设置为1 7 但不知道为什么maven仍然使用1 5 这是我在 pom xml 中的插件
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • try-with-resources 中出现死代码警告,但翻译后的 try-catch-finally 中没有出现死代码警告

    以下代码使用try 有资源 https docs oracle com javase specs jls se7 html jls 14 html jls 14 20 3Java 8 中引入的构造 偶尔抛出 方法被声明为抛出一个偶尔的异常
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 元音子序列

    我在准备面试时在网站上发现了这个问题 字符串的神奇子序列S是一个子序列S那 按顺序包含所有五个元音 查找字符串的最大神奇子序列的长度S 例如 如果S aeeiooua then aeiou and aeeioou是神奇的子序列 但aeio
  • 将 TIMESTAMP 列更新为可为空

    我有一个表存在于两个数据库中 在一个数据库中有一个表 其中有一列称为ROW VERSION这是类型TIMESTAMP NOT NULL 在第二个数据库中 同一个表具有相同类型的列TIMESTAMP但它是类型TIMESTAMP NULL 我想
  • 活动图 定时事件

    我正在尝试建模以下内容 填写提交表单时 系统每 5 分钟自动保存一次用户进度 这是我尝试过的 但我认为这是不正确的 就我而言 仅在 填写提交 活动完成后才会询问条件 另外 我不想表明用户正在再次开始 填写提交 活动 您将使用由虚线框表示的可
  • 具有多个连接的 ActiveRecord 查询无法识别关系

    我正在尝试编写一个 ActiveRecord 查询 使用以下查询返回注册特定课程的所有学生 def self students enrolled in course id Student joins enrollments joins se
  • .net 控制台应用程序 32 位与 64 位

    NET 中的应用程序是否需要构建为 64 位才能充分利用具有 64 位操作系统的计算机 或者它是否会像 32 位构建一样利用它 基本上 我们遇到了内存不足异常的问题 建议在 64 位机器上运行控制台应用程序 这 可能 解决该问题 问题是我们
  • 使用 Spring Security + Spring data + MongoDB 进行身份验证

    我想将 Spring security 与 MongoDB 结合使用 使用 Spring 数据 并从我自己的数据库中检索用户以实现 spring security 但是 我不能这样做 因为我的用户服务类型似乎不受支持 这是我的 UserSe
  • pip (python2) 和 pip3 (python3) 可以共存吗?

    我一直认为 pip 适用于 Python 2 pip3 适用于 Python 3 为了安装不同版本的 pip 我执行了以下操作 sudo apt get install python pip sudo apt get install pyt
  • PHP json_decode 有单引号问题,但没有双引号问题

    通过示例最容易解释 var dump json decode a b c d e f NULL var dump json decode a b c d e f array 3 0 gt object stdClass 1 1 a gt s
  • 如何在svg中动态设置坐标点

    我正在尝试使用 SVG 创建一个三角形 我这样做是按照tutorial http tutorials jenkov com svg polygon element html 但问题是坐标是硬编码的 在画布中 我通过从 javascript
  • 成员表达式无法从可为空的十进制转换为对象

    我正在开发一个 MVC 项目 并希望向 Html TextboxFor 方法传递属性名称 这是我的视图模型 public class RuleViewModel
  • AngularJS - 调用 Flickr API 失败并显示警告消息

    我有一个简单的 AngularJS 应用程序 允许用户搜索 Flickr 照片 问题出在 IE 中 当我调用 Flickr API 时 我收到以下消息 此页面正在访问不受其控制的信息 这会带来安全风险 你想继续吗 如果我单击 是 应用程序就
  • 如何在不使用 TableViewController 的情况下创建分组 TableView

    我有一个 UITableView 我希望它有 2 个部分 我现在知道 如果您使用 UITableViewController 并且使用静态单元格 则只能拥有分组部分 而我都不是 我想做的可能吗 如果是这样 我可以在哪里寻求设置方面的帮助 似
  • org.springframework.batch.item.ReaderNotOpenException:阅读器必须先打开才能读取

    我正在使用 Spring Batch 来运行 从数据库表读取并写入另一个表 作业 该作业是由 Quartz 调度的 数据库是 oracle 它是 c3p0 我遇到了 reader not open 异常 这是工作背景
  • sequelize/sequelize-typescript - findAll 与 HasMany 返回一个对象而不是数组

    我正在尝试使用sequelize typescript 建立一对多关系 但是当我尝试获取数据时 许多关系返回给我一个对象而不是数组 我有两张桌子 球队和球员 团队可以有很多玩家 一个玩家属于一个团队 我的模型 Table export cl
  • 防止 OSX 版 Safari 中的捏合/缩放

    我有一个带有多个视口的 html5 应用程序 我打算使用 HammerJS 在各个视口上提供捏合 缩放手势 目前 每当我捏住 Safari OSX 时 整个窗口就会放大或缩小 我想防止这种情况发生 对于 iOS 这有效 但它并不能阻止 OS
  • 许可 WPF、Silverlight 和 WP7 程序集

    我正在寻找一种解决方案来许可 WPF Silverlight 和 WP7 程序集 所讨论的程序集是一个图表控件 它具有可跨平台使用的单个 API 我正在为每个平台 WPF SL WP7 创建一个单独的 MSI 用户可以下载并安装 这将在其
  • wmic 进程表(在命令提示符窗口内)可以按值排序吗?

    我一直在探索各种选择 例如 format标志 但是排序似乎只能在 XML 或 HTML 输出中进行 我想在命令提示符本身内进行排序 看来即使是TaskList http technet microsoft com en us library
  • 如何在 Java 中对计算密集型代码段进行多线程处理?

    我有一个java程序 其中一部分是计算密集型的 就像这样 for i 1 512 COMPUTE INTENSIVE SECTION end 我想将其拆分为多线程 使其运行时更快 计算密集部分不是按顺序进行的 这意味着先运行 i 1 或先运
  • 此类对于键 setOutput 不符合键值编码[重复]

    这个问题在这里已经有答案了 我是 iOS Objective C 的新手 我正在努力学习 我正在阅读 Sam 的 自学 iOS 我正在做一个名为 Hello Noun 的项目 它不显示 Hello World 而是接受输入并显示 Hello
  • javax.crypto.BadPaddingException:解密时给定最终块未正确填充错误

    我正在按如下方式对数据进行加密和解密 但出现错误 protected Cipher aes Gen with Key byte key Cipher cipher null try byte key hash key toString ge