在各个客户服务器上运行好好的PBE加解密程序突然在一个用AIX服务器的客户那报错了,错误信息为:Given final block not properly padded,从异常堆栈发现,其它服务器的jdk 中的加密提供者都是 sun的,而这台aix服务jdk解密提供者为 ibm的!!!
看这意思貌似是填充相关的错误,首先反应是google一下,== 谷歌已经没了,那百度一下。
网上说的有几种情况,
1、加密代码问题,导致报错;但我这段代码可以正常运行,只是在不同加解密提供商下导致的错误,排除
2、说不同平台的SecureRandom random=new SecureRandom(); 实现不同,需要使用程序指定的方式生成随机数。我看了下自己的加密算法,貌似解密的时候,并没有用到此随机数,只有在加密的时候用它生成salt. 所以,半信半疑的排除了
无奈之下,我将算法 由 PBEWithSHA1AndDESede 修改为:PBEWithMD5AndDES 进行测试,结果居然能正常运行,可以想象,ibm提供的pbe解密应该是没有提供 PBEWithSHA1AndDESede 这种算法。如果提供了,那应该就能正常解密,毕竟pbe是标准对称加密算法,所有算法提供者提供的算法计算结果应该都一样,变的只是密码而已。
附上代码:
private static final String PBECODER_PASSWORD = "www.lyjilu.com";
/**
* JAVA6支持以下任意一种算法
* PBEWITHMD5ANDDES
* PBEWithMD5AndDES
* PBEWITHMD5ANDTRIPLEDES
* PBEWITHSHAANDDESEDE
* PBEWITHSHA1ANDRC2_40
* PBKDF2WITHHMACSHA1
* */
public static final String ALGORITHM="PBEWithMD5AndDES";
/**
* 迭代次数
* */
public static final int ITERATION_COUNT=100;
/**
* 盐初始化
* 盐长度必须为8字节
* @return byte[] 盐
* */
public static byte[] initSalt() throws Exception{
//实例化安全随机数
SecureRandom random=new SecureRandom();
//产出盐
return random.generateSeed(8);
}
/**
* 转换密钥
* @param password 密码
* @return Key 密钥
* */
private static Key toKey(String password) throws Exception{
//密钥转换
PBEKeySpec keySpec=new PBEKeySpec(password.toCharArray());
//实例化
SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(ALGORITHM);
//生成密钥
SecretKey secretKey=keyFactory.generateSecret(keySpec);
return secretKey;
}
/**
* 加密
* @param data 待加密数据
* @param password 密码
* @param salt 盐
* @return byte[] 加密数据
*
* */
public static byte[] encrypt(byte[] data,String password,byte[] salt) throws Exception{
//转换密钥
Key key=toKey(password);
//实例化PBE参数材料
PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATION_COUNT);
//实例化
Cipher cipher=Cipher.getInstance(ALGORITHM);
//初始化
cipher.init(Cipher.ENCRYPT_MODE, key,paramSpec);
//执行操作
return cipher.doFinal(data);
}
public static byte[] encrypt(byte[] data,byte[] salt) throws Exception{
String pwd = PBECODER_PASSWORD;
return encrypt(data,pwd, salt);
}
/**
* 解密
* @param data 待解密数据
* @param password 密码
* @param salt 盐
* @return byte[] 解密数据
*
* */
public static byte[] decrypt(byte[] data,String password,byte[] salt) throws Exception{
//转换密钥
Key key=toKey(password);
//实例化PBE参数材料
PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATION_COUNT);
//实例化
Cipher cipher=Cipher.getInstance(ALGORITHM);
//初始化
cipher.init(Cipher.DECRYPT_MODE, key,paramSpec);
//执行操作
return cipher.doFinal(data);
}
public static byte[] decrypt(byte[] data,byte[] salt) throws Exception{
return decrypt(data, PBECODER_PASSWORD, salt);
}
分享到:
相关推荐
### Java 文件加密解密关键技术详解 #### 一、概述 在信息安全领域,加密技术是保障数据安全的关键手段之一。本文将详细介绍Java中常用的几种加密算法,包括但不限于DES、PBE、RSA、DH、DSA和ECC等,并提供部分...
在Java中,PBE的实现主要依赖于`javax.crypto`包中的类和接口,如`PBEKeySpec`(用于存储密码和盐值)、`PBEParameterSpec`(用于存储盐值和迭代次数)、`PBE Cipher`(用于执行加密和解密操作)等。以下是一般步骤...
Java 使用jasypt包辅助,实现密码加解密。本方法实现了C#版,适用于一方加密另一方解密的情况,根据默认配置改版,可在当前版本基础上自定义更改指定算法、hash迭代次数、salt生成方式等
Polaris Bios Editor(PBE)1.7.4.1是一个专门针对AMD北极星架构显卡进行BIOS修改的工具,它为用户提供了更深入的控制权,以优化显卡性能和调整功耗。这款软件的最新版本1.7.4.1着重添加了对WX7100显卡的支持,使得...
**Java与C#的PBE加密** PBE(Password-Based Encryption)基于密码的加密是一种常见的加密方式,它结合了密钥派生函数(PBKDF)和对称加密算法,如DES(Data Encryption Standard),用于保护数据的安全。在Java和...
标题中的“VASP赝势文件PAW PBE”是指用于VASP(Vienna Ab initio Simulation Package)软件进行第一性原理量子力学计算的一种特定类型的赝势库。在DFT(密度泛函理论)计算中,赝势是模拟原子核与电子相互作用的一...
本文将主要介绍几种常见的加密解密算法,包括DES、PBE、RSA、DH、DSA以及ECC,并提供简单的代码示例。 首先,我们来看基本的单向加密算法。这些算法主要用于生成不可逆的散列值,以验证数据的完整性和一致性。 1. ...
本文将深入探讨Java中常见的几种加密解密算法:SHA算法、HMAC算法、DES算法、PBE算法、AES算法、RSA算法、数字签名以及D-H算法。 1. SHA(Secure Hash Algorithm)算法: SHA是一种散列函数,它能将任意长度的输入...
Java Jct 加密解密工具包源码,WDSsoft免费源代码,java加密解密编程常用工具包 JCT 1.0,作者吴东升 常蕴秋,BlowfishTool.java... PBETool.java封装同PBE(基于口令的加密)算法有关的方法,可用使用PBE算法加密和解密
与传统的对称加密算法(如DES、3DES、AES、Blowfish、RC2和RC4)相比,PBE在安全性上有所增强,因为它引入了两个重要的概念:盐(salt)和迭代次数。 盐是随机生成的一段数据,它的作用是增加密码的复杂性,防止...
赝势(pseudopotential),或有效势(effective potential),是指在对能带结构进行数值计算时所引入的一个虚拟的势。引入赝势有助于实现一个复杂的系统的近似计算。事实上,赝势近似法是正交平面波...pbe是其中的一种
这是一种密码基于密钥的加密(Password-Based Encryption,简称PBE)方法,结合了HMAC(Hash-based Message Authentication Code)和AES(Advanced Encryption Standard)算法。HMAC-SHA512用于生成基于密码的密钥,...
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; public class JasyptUtil { public static String encyptPwd(String password, String value) { PooledPBEStringEncryptor encryptor = new ...
PBE算法是对称加密算法的综合算法,常见算法PBEWithMD5AndDES,使用MD5和DES算法构建了PBE算法。将盐附加在口令上,通过消息摘要算法经过迭代获得构建密钥的基本材料,构建密钥后使用对称加密算法进行加密解密。 ...
加解密技术扮演着保护信息安全的核心角色。本文将深入探讨几种常见的加密算法——DES、AES、PBE、DH、RSA以及ElGamal,并结合DataServlet实例来阐述如何在实际应用中使用这些算法。 首先,DES(Data Encryption ...
接着,使用`javax.crypto.Cipher`进行加密和解密操作,选择如AES(Advanced Encryption Standard)这样的对称加密算法,并指定PBE算法,如`PBEWithMD5AndTripleDES`、`PBEWithSHA1AndDESede`或者更现代的`...
Jasypt(Java Simple and Strong Encryption)是一个强大的加密库,提供了简单易用的API,让开发者可以轻松地在应用程序中实现加密和解密功能。本篇文章将深入探讨Jasypt的核心概念、使用方法以及如何将其与Spring ...
《JAVA加密和解密的艺术(第二版)》是一本深入探讨Java平台上的加密与解密技术的专业书籍。这本书不仅提供了理论知识,还包含了丰富的实践示例,帮助读者理解和掌握加密技术在实际应用中的运用。其内容涵盖了从基本...
PBE 加密实例,加密后用base64转码.密文具有一定的时效性,时间可自定义
Pharo 开发文档,需要好好阅读 Pharo by Example Andrew P. Black Stéphane Ducasse Oscar Nierstrasz Damien Pollet with Damien Cassou and Marcus Denker Version of 2009-10-28