java解密出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解密出错相关的知识,希望对你有一定的参考价值。

public byte[] getDesCode(byte[] byteD)
System.out.println(byteD);
byte[] byteFina = null;
Cipher cipher;
try
byte[] iv = new sun.misc.BASE64Decoder().decodeBuffer( "t4JPbY+rXgk= ");
javax.crypto.spec.IvParameterSpec ips = new javax.crypto.spec.IvParameterSpec(
iv);
cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,key,ips);
byteFina = cipher.doFinal(byteD);
System.out.println(byteFina);
catch (Exception e)
e.printStackTrace();
finally
cipher = null;

return byteFina;


报错:
[B@1b044df
javax.crypto.BadPaddingException: Given final block not properly padded
null
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at DESCryptByte.getDesCode(DESCryptByte.java:68)
at VoicePlay.run(VoicePlay.java:70)
at java.lang.Thread.run(Unknown Source)
java.lang.NullPointerException
at com.sun.media.sound.DirectAudioDevice$DirectDL.write(Unknown Source)
at VoicePlay.run(VoicePlay.java:73)
at java.lang.Thread.run(Unknown Source)

网上到处找,我查了,填充方法没错都是PKCS5Padding
iv向量也设置了,密钥也相同
我解密的是一个byte[1024]的数据,用这个方法测试短数据的时候正常,就是放到项目里调用出错,求救啊
有大神帮帮忙吗,联系我
QQ:448049705

如果实在不行给我一个可以用的对byte[]进行加密的方法也行啊

 你那个代码少得东西太多,我左试右试,都是错,也不知道你的初始值都是什么。

给你写了一个加密解密的,希望对你有帮助。
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class Test
/**
* 创建密匙
*/
public SecretKey createSecretKey(String algorithm)
// 声明KeyGenerator对象
KeyGenerator keygen;
// 声明 密钥对象
SecretKey deskey = null;
try
// 返回生成指定算法的秘密密钥的 KeyGenerator 对象
keygen = KeyGenerator.getInstance(algorithm);
// 生成一个密钥
deskey = keygen.generateKey();
catch (NoSuchAlgorithmException e)
e.printStackTrace();

// 返回密匙
return deskey;

/**
* 根据密匙进行DES加密
*/
public String encryptToDES(SecretKey key, String info)
// 定义 加密算法,可用 DES,DESede,Blowfish
String Algorithm = "DES";
// 加密随机数生成器 (RNG),(可以不写)
SecureRandom sr = new SecureRandom();
// 定义要生成的密文
byte[] cipherByte = null;
try
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
// 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
c1.init(Cipher.ENCRYPT_MODE, key, sr);
// 对要加密的内容进行编码处理,
cipherByte = c1.doFinal(info.getBytes());
catch (Exception e)
e.printStackTrace();

// 返回密文的十六进制形式
return byte2hex(cipherByte);

/**
* 根据密匙进行DES解密
*/
public String decryptByDES(SecretKey key, String sInfo)
// 定义 加密算法,
String Algorithm = "DES";
// 加密随机数生成器 (RNG)
SecureRandom sr = new SecureRandom();
byte[] cipherByte = null;
try
// 得到加密/解密器
Cipher c1 = Cipher.getInstance(Algorithm);
// 用指定的密钥和模式初始化Cipher对象
c1.init(Cipher.DECRYPT_MODE, key, sr);
// 对要解密的内容进行编码处理
cipherByte = c1.doFinal(hex2byte(sInfo));
catch (Exception e)
e.printStackTrace();

// return byte2hex(cipherByte);
return new String(cipherByte);

/**
* 将二进制转化为16进制字符串
*/
public String byte2hex(byte[] b)
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++)
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;


return hs.toUpperCase();

/**
* 十六进制字符串转化为2进制
*/
public byte[] hex2byte(String hex)
byte[] ret = new byte[8];
byte[] tmp = hex.getBytes();
for (int i = 0; i < 8; i++)
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);

return ret;

public static byte uniteBytes(byte src0, byte src1)
byte _b0 = Byte.decode("0x" + new String(new byte[] src0 ))
.byteValue();
_b0 = (byte) (_b0 << 4);
byte _b1 = Byte.decode("0x" + new String(new byte[] src1 ))
.byteValue();
byte ret = (byte) (_b0 ^ _b1);
return ret;

public static void main(String[] args)
Test jiami = new Test();
// 生成一个DES算法的密匙
SecretKey key = jiami.createSecretKey("DES");
// 用密匙加密信息"Hello world!"
String str1 = jiami.encryptToDES(key, "Hello");
System.out.println("使用des加密信息Hello为:" + str1);
// 使用这个密匙解密
String str2 = jiami.decryptByDES(key, str1);
System.out.println("解密后为:" + str2);

追问

我需要给语音通信进行加密,我录音后得到的是个byte[]类型的数组
byte[] data = new byte[1024];
while (thread != null)
numBytesRead = line.read(data, 0,1024);
captureOutputStream.write(reData, 0, numBytesRead);//写入输出流
catch (Exception ex)
break;


我只想给数据data加密,求解这样怎么搞?是针对byte[]数组加密还是把它转成别的什么再加密活着传输

参考技术A

你加密解密的时候 都设置一下编码看看~

c.doFinal(byteD.getBytes("ISO-8859-1")),"ISO-8859-1");


// RSA公钥加密
public String encryptData(String message) throws Exception
Cipher c = Cipher.getInstance("RSA");
c.init(Cipher.ENCRYPT_MODE, public_key);
return new String(c.doFinal(message.getBytes(encoding)), encoding);

// RSA私钥解密
public String decryptData(String enmsg) throws Exception
Cipher c = Cipher.getInstance("RSA");
c.init(Cipher.DECRYPT_MODE, private_key);
return new String(c.doFinal(enmsg.getBytes(encoding)), encoding);

追问

不行啊……RSA也出错,我需要一个可以加密解密byte[]的方法……

追答

嗯,你看下这个吧
http://www.blogjava.net/vwpolo/archive/2009/12/05/304874.html#383365

参考技术B 建议使用js进行提交然后使用encodeURIComponent在提交的中文参数中进行编码,这样就好了本回答被提问者采纳

以上是关于java解密出错的主要内容,如果未能解决你的问题,请参考以下文章

解密 Forms cookie 时出现“加密操作期间出错”

使用 RSA/PEM 文件解密测试消息时出错

尝试解密RSA时出错

加密和解密时出错。无法找到异常的原因

Spring SAML:解密加密密钥时出错,没有安装的提供程序支持此密钥

python中的ascii加密程序出错