`

DES 解密错 Given final block not properly padded 转

阅读更多

Given final block not properly padded

 

我也有碰到过这样的问题
原因是:
1、加密完byte[] 后,需要将加密了的byte[] 转换成base64保存,如:
BASE64Encoder base64encoder = new BASE64Encoder();
String encode=base64encoder.encode(bytes);

2、解密前,需要将加密后的字符串从base64转回来再解密,如:
BASE64Decoder base64decoder = new BASE64Decoder();
byte[] encodeByte = base64decoder.decodeBuffer(str);

后面是我的源代码,希望对你有所帮助

import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.MessageDigest;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * Security 提供了一个安全算法类,其中包括对称密码算法和散列算法
 */
public final class EbotongSecurity {
// The length of Encryptionstring should be 8 bytes and not be
// a weak key
private final static BASE64Encoder base64encoder = new BASE64Encoder();
private final static BASE64Decoder base64decoder = new BASE64Decoder();
private final static String encoding = "UTF-8";

/**
 * 加密字符串
 */
public static String ebotongEncrypto(String str) {
String result = str;
if (str != null && str.length() > 0) {
try {
byte[] encodeByte = symmetricEncrypto(str.getBytes(encoding));
result = base64encoder.encode(encodeByte);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}

/**
 * 解密字符串
 */
public static String ebotongDecrypto(String str) {
String result = str;
if (str != null && str.length() > 0) {
try {
byte[] encodeByte = base64decoder.decodeBuffer(str);
byte[] decoder = EbotongSecurity.symmetricDecrypto(encodeByte);
result = new String(decoder, encoding);
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}

/**
 * 对称加密方法
 * 
 * @param byteSource
 *            需要加密的数据
 * @return 经过加密的数据
 * @throws Exception
 */
public static byte[] symmetricEncrypto(byte[] byteSource) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
int mode = Cipher.ENCRYPT_MODE;
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
byte[] keyData = { 1, 9, 8, 2, 0, 8, 2, 1 };
DESKeySpec keySpec = new DESKeySpec(keyData);
Key key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(mode, key);
byte[] result = cipher.doFinal(byteSource);
// int blockSize = cipher.getBlockSize();
// int position = 0;
// int length = byteSource.length;
// boolean more = true;
// while (more) {
// if (position + blockSize <= length) {
// baos.write(cipher.update(byteSource, position, blockSize));
// position += blockSize;
// } else {
// more = false;
// }
// }
// if (position < length) {
// baos.write(cipher.doFinal(byteSource, position, length
// - position));
// } else {
// baos.write(cipher.doFinal());
// }
// return baos.toByteArray();
return result;
} catch (Exception e) {
throw e;
} finally {
baos.close();
}
}

/**
 * 对称解密方法
 * 
 * @param byteSource
 *            需要解密的数据
 * @return 经过解密的数据
 * @throws Exception
 */
public static byte[] symmetricDecrypto(byte[] byteSource) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
int mode = Cipher.DECRYPT_MODE;
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
byte[] keyData = { 1, 9, 8, 2, 0, 8, 2, 1 };
DESKeySpec keySpec = new DESKeySpec(keyData);
Key key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("DES");
cipher.init(mode, key);
byte[] result = cipher.doFinal(byteSource);
// int blockSize = cipher.getBlockSize();
// int position = 0;
// int length = byteSource.length;
// boolean more = true;
// while (more) {
// if (position + blockSize <= length) {
// baos.write(cipher.update(byteSource, position, blockSize));
// position += blockSize;
// } else {
// more = false;
// }
// }
// if (position < length) {
// baos.write(cipher.doFinal(byteSource, position, length
// - position));
// } else {
// baos.write(cipher.doFinal());
// }
// return baos.toByteArray();
return result;
} catch (Exception e) {
throw e;
} finally {
baos.close();
}
}

/**
 * 散列算法
 * 
 * @param byteSource
 *            需要散列计算的数据
 * @return 经过散列计算的数据
 * @throws Exception
 */
public static byte[] hashMethod(byte[] byteSource) throws Exception {
try {
MessageDigest currentAlgorithm = MessageDigest.getInstance("SHA-1");
currentAlgorithm.reset();
currentAlgorithm.update(byteSource);
return currentAlgorithm.digest();
} catch (Exception e) {
throw e;
}
}

}

<script></script>

个人签名

-------------------------------------

 

图盾 淘宝保护 保护图片 图片防盗

解密的时候报错: 
javax.crypto.BadPaddingException: Given final block not properly padded 
详细错误信息: 
javax.crypto.BadPaddingException: Given final block not properly padded 
at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DashoA6275) 
at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DashoA6275) 
at javax.crypto.Cipher.doFinal(DashoA6275) 
at ThreeDesTool.decryptMode(ThreeDesTool.java:41) 
at Authentication.Authentication(Authentication.java:122) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:25) 

分享到:
评论
2 楼 IceWee 2012-05-19  
同问!! 解决方法呢?? 我是在做对大文件加密解密,加密没有问题,解密的时候这样了,大文件不能一下读取到内存中,需要分段读取加密/解密的。
1 楼 songfantasy 2011-01-24  
这个错误,怎么解决的?

相关推荐

    JCEPolicyJDK8.zip

    当环境为jdk1.8.0_191之前的版本时,使用jdk自带的AES256加密算法时会报异常Given final block not properly padded Input length must be multiple of 16 when decrypting with padded cipher,可通过将此附件解压...

    微信小程序解密遇到pad block corrupted

    这里我们遇到了一个问题:"pad block corrupted",这是一个关于加密解密过程中的错误提示,通常与填充块相关。在AES(Advanced Encryption Standard)加密算法中,如果解密时发现填充不正确,就会出现这种错误。下面...

    AES加密(解决了windows下正常,linux报错的问题)

    windows上加解密正常,linux上加密正常,解密时发生 异常: javax.crypto.BadPaddingException: Given final block not properly padded

    解决Linux操作系统下AES解密失败的问题

    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 ...

    java AES加密 解决加密过长非法异常问题

    在Java中,我们可以使用`javax.crypto`包中的`Cipher`类来实现加密和解密操作。 1. **基于字符串的AES加密**: - 首先,需要将字符串转换为字节数组,可以使用UTF-8编码。 - 然后,创建一个`KeySpec`对象,例如`...

    java/javascript/iOS的AES加解密(AES/CBC/PKCS5Padding)

    本文将深入探讨AES加密,特别是使用CBC(Cipher Block Chaining,密码块链接)模式和PKCS5Padding填充方式,并在JavaScript、Java和iOS平台上实现这一加密过程。 **一、AES加密简介** AES是一种对称加密算法,由...

    在64位机器上使用plSQL连接Oracle的问题(SQLNet not properly installed)

    标题中的“在64位机器上使用plSQL连接Oracle的问题(SQLNet not properly installed)”提示了我们在64位操作系统中尝试使用plSQL Developer工具与Oracle数据库建立连接时遇到的一个常见问题,即SQLNet配置不正确。...

    JAVAAES加解密在linux中的问题.pdf

    在Windows系统上能够正常进行加解密,但在Linux系统中出现解密异常,报错信息为“Given final block not properly padded”,提示最后的区块填充不正确。这个问题通常与加密使用的填充方式、随机数生成器(Random ...

    解决Delphi DBX和MySQL连接的噩梦:DBX Error: Driver could not be properly initialized.

    (DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, ...),我找到了合适的libmysql.dll和dbxmys.dll组合,把下面这个libmysql.dll拷贝到XE的bin目录...

    Oracle 回收站功能,彻底删除表ORA-00933:SQL command not properly ended

    ORA-00933: SQL command not properly ended ``` 解决方法是确保SQL语句完整无误,并使用正确的语法进行删除操作。 #### 四、总结 Oracle的回收站功能为用户提供了一个方便的方式来管理数据库对象的删除与恢复,极...

    完美解决Linux操作系统下aes解密失败的问题

    异常信息提示"Given final block not properly padded",这意味着在解密过程中遇到了不正确的填充。这个错误通常是由以下原因引起的: 1. **密钥生成问题**:在原始的代码中,密钥生成器(_generator)初始化时使用了...

    VisualRoute is not installed properly 解决办法

    visualroute 2010 在使用eclvr14c进行破解时,提示"VisualRoute is not installed properly ",经本人多次跟踪实践发现问题在缺少文件上: 检查安装完后在C:\Documents and Settings\Administrator\下是否有mswin32v16....

    明宇报表插件/如意报表插件解决浏览器出现Ming-WebReport viewer has not been installed

    当用户遇到“Ming-WebReport viewer has not been installed properly.”的错误提示时,通常意味着报表查看器没有正确安装或者配置不完整,这会影响报表的正常显示和使用。本文将详细介绍如何解决这个问题。 首先,...

    swt资源释放问题

    SWT 资源释放问题详解 SWT(Standard Widget Toolkit)是一种基于 Java 的 GUI 工具包,提供了丰富的图形用户界面组件和事件处理机制。但是, SWT 中的资源释放问题是一件棘手的事情。如果不正确地释放资源,可能...

    keeplived离线安装openssl-devel依赖包

    由于公司业务并发比较高需要高可用使用LVS keeplived。在linux系统centos6.5版本中安装keeplived时,需要... OpenSSL is not properly installed on your system. !!! !!! Can not include OpenSSL headers files. !!!

    c++加密解密文件源码.zip

    - 输入要加密/解密的文件的路径,可以是相对路径,也可以是绝对路径。 - Choose to encrypt (1) or decrypt (2) the file - Enter a password. If you choose “decrypt” in the previous step, the password must ...

    unity3d 打包成webgl 错误解决办法

    "il2cpp.exe did not run properly!"这个错误提示表明在编译IL( Intermediate Language)代码到JavaScript和WebAssembly的过程中出现了问题。以下是解决此类问题的一些常见步骤: 1. **检查Unity版本**:确保你...

    Final Uninstaller

    Final Uninstaller provides an easy and comprehensive solution for uninstalling unwanted programs, whether it's running properly on your computer now or it has been corrupted and leaves some remnants ...

    dcr.rar_Not Yet

    描述中提到的"Stride is not properly defined yet, default to 0x10 for Axon."表明在某个特定的代码段或库(可能是与"axon"相关的)中,Stride尚未被正确地定义。在这种情况下,开发人员可能已经设定一个默认值0x...

    delphi连接mysql数据库

    在IT行业中,Delphi是一种流行的面向对象的编程环境,它基于Pascal语言,而MySQL则是一种广泛使用的开源关系型数据库管理系统。将Delphi与MySQL结合使用,开发者可以创建高效、可靠的数据库应用程序。...

Global site tag (gtag.js) - Google Analytics