JCA和JCE常见问题汇总(持续更新)

一 javax.crypto.BadPaddingException: Given final block not properly padded

1.1 错误原因:可能有两个原因,任何一个原因都会导致报错。

1 DES加密的时候,最后一位长度不足64的,它会自动填补到64。如果在读取加密后的文件没有读取完成的时候,比如InputStream的read()方法就很容易出现读取不完全的情况,这个时候就会报错。

2 密钥文件错误,加密的密钥和解密的密钥匹配,大家一般不会犯这这种错误,但是如果存在这种错误,不太容易察觉。

1.2 解决方法

如果是密钥出了问题,换成正确的密钥即可。

如果是加密的文件出了问题,先检查加密文件的字节数和成功读取的字节数是否一致。可以采用以下方式保证完全读取。

/* 读取密钥文件 */
InputStream keyInputStream = SumaClassLoader.class
                .getResourceAsStream("secret.key");
if (keyInputStream != null)
{
    try
    {
        System.out.println("The keyInputStream is " + keyInputStream);
        int count = 0;
        while (count == 0)
        {
            //available()方法在读取本地文件时不会出问题,但是对于网络文件,存在延时的问题,有时候会收到的直接是0字节。
            count = keyInputStream.available();
        }
        System.out.println("The count of keyInputStream is " + count);
        byte keyData[] = new byte[count];
        int readCount = 0;
        while(readCount < count)
        {
            //read()方法不会保证完整的去读取count个字节,它只会保证最多读取count个字节,最少读取一个。
            readCount += keyInputStream.read(keyData, readCount, count - readCount);
        }
        keyInputStream.close();
    }
}

除了完整读取数据的方法外,还可以尝试下面这个方法。

如果你是用以下方式来获取Cipher对象

Cipher cipher = Cipher.getInstance("DES")

那么它等效于

ipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding")

这表示不足64位时会做填充,可以改成以下方式:

Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 04:10:06

JCA和JCE常见问题汇总(持续更新)的相关文章

Android 常见问题收集 (持续更新)

gridview中设置item的高度. 一.BaseAdapter中的getView中设置 AbsListView.LayoutParams param = new AbsListView.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, parent.getWidth()/2+DpPx.dip2px(context,20));//-20 10spacing 5padding + 40 textview.height

Xcode编译异常和警告汇总(持续更新中)

1.Method definition for 'xxx' not found xxx的方法没有实现 出现原因.h声明了xxx方法但是.m没有实现xxx方法 解决方法:在类的.m文件实现xxx方法 2. Instance variable ‘xxx' accessed in class method  在类方法中访问了'xxx’实例变量 出现原因:在类方法中使用了实例变量 解决方法:如果真得需要在类方法中使用某个变量,可以把这个变量定义成全局变量,而不要实例变量,如在类方法外面定义变量(就是定义

跟我学SpringCloud | 终篇:文章汇总(持续更新)

SpringCloud系列教程 | 终篇:文章汇总(持续更新) 我为什么这些文章?一是巩固自己的知识,二是希望有更加开放和与人分享的心态,三是接受各位大神的批评指教,有任何问题可以联系我: [email protected]. Github源码下载:https://github.com/meteor1993/SpringCloudLearning <跟我学SpringCloud>系列: Greenwich版 Spring Cloud Greenwich.SR1; Spring Boot 2.1

C++ 基础知识汇总 持续更新

摘录一些C++面试常考问题,写一些自己的理解,欢迎来摘果子. static关键字 用于声明静态对象: 静态函数只在本文件可见.(默认是extern的) 全局静态对象:全局静态对象,存储在全局/静态区,作用域整个程序,在程序结束才销毁: 局部静态对象:在函数内部加上static声明的变量,在首次调用时初始化,然后一直驻留在内存,作用域是该函数,可用于函数调用计数(primary有例子),程序结束释放: 静态数据成员:归属于类,类对象共享,类外初始化,类对象可访问: 静态函数成员:归属于类,只能访问

痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手册/数据手册,官方EVK板设计文件,各种应用笔记,各种参考设计方案.培训视频.软件SDK开发包,官方IDE/CFG工具,第三方软件支持等应有尽有,如果这上面文档你都能全部仔细看一遍,软件都能下载用起来,不用怀疑,你就是资深专家了. 其中痞子衡特别推荐你把所有应用笔记都看一遍,这些笔记凝结了所有恩智浦

Type Script在Visual Studio 2013中的问题汇总(持续更新…)

◆ TypeScript在vs2012下的问题 TypeScript对VS2012支持度比较低,建议升级为VS2013版本. ◆ 在VS2013中无法创建TypeScript项目 VS2013默认不支持TypeScript. 需要在[工具]-[扩展和更新]中安装TypeScript,目前为止(2015年9月16日)for VS2013的最新版TS为1.5版本,但是实测有一些问题,建议安装比较稳定的1.4版本 ◆ 编译提示“TypeScript\1.4\1.4\tsc.exe 无效”的问题 解决方

项目工作中常见问题系列! 持续更新!

欧洲日期转标准或中文日期 欧洲大多数国家日期格式 24-12-1991  代表 dd-mm-yyyy 现在我想转换成中文日期格式1991年12月24日 或者转成国际标准格式日期 1991-12-24  yyyy-mm-dd格式 怎么解决呢? 这里我们可以通过正则表达式 轻松解决这个问题 static void Main(string[] args) { //定义一组欧洲日期列表 数据来源可能是一张数据表 或txt文本文件等.. var enDateList = new List<string>

[Linux] PuTTY指令汇总(持续更新中...)

写在前面: 以前真心没有玩过Linux系统,总感觉整天摆弄Linux的同学都是大牛.如今,在公司里实习需要远程登录Linux服务器,所有的代码都要在开发板上完成,所以被逼无奈也不得不定下心来好好学学Linux系统的各种操作.我现在用的远程登录软件是PuTTY,所以简单总结一下常用的PuTTY指令,方便以后进行查阅. 1. PuTTY介绍 随着Linux在服务器端应用的普及,Linux系统管理越来越依赖于远程.在各种远程登录工具中,PuTTY是出色的工具之一.PuTTY是一个免费的.Windows

Angular 学习资源汇总(持续更新ing)

AngularJS 是Google 推出的一套前端JS开发的 MV* (Model-View-Whatever)框架,它引入了一些编译器的概念,比如编译.链接,具有强大的双向数据绑定(Two-way binding)和前端模板功能(directive),使得我们可以轻易实现高服用.高可扩展性的脚本,大大提高编程的效率 鉴于国内Angular 的使用者比较少,这里主要汇总一些本人学习 Angular 以来看到的优质资源,一些是基本教程,一些是核心概念的讨论,还有一些是编程指导原则,希望对初学者有用