0 0

Linux下AES解密算法异常5

 

网上找了一个DES安全编码组件,据说用的人挺多的,也用了挺长一段时间,在Windows下一直很正常,没出什么问题,但是迁到linux下时,算法没有正常工作,报出了异常:

 

 

 

javax.crypto.BadPaddingException: Given final block not properly padded
        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 BidCoder.decrypt(BidCoder.java:122)
        at BidCoder.closePass(BidCoder.java:193)
        at BidCoder.main(BidCoder.java:204)

 

 

然后根据提示BidCoder.decrypt(BidCoder.java:122),找到源码的第122行,

 

return cipher.doFinal(data);

 

网上也查到这个异常的相关信息,主要是说是由于算法填充块产生的异常,但没有找到解决方法。  希望各位高手们给给建议,源码如下:

 

 

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.SecretKeySpec;

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

/**
 * DES安全编码组件
 * 
 * <pre>
 * 支持 DES、DESede(TripleDES,就是3DES)、AES、Blowfish、RC2、RC4(ARCFOUR)
 * DES          		key size must be equal to 56
 * DESede(TripleDES) 	key size must be equal to 112 or 168
 * AES          		key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
 * Blowfish     		key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
 * RC2          		key size must be between 40 and 1024 bits
 * RC4(ARCFOUR) 		key size must be between 40 and 1024 bits
 * 具体内容 需要关注 JDK Document http://.../docs/technotes/guides/security/SunProviders.html
 * </pre>
 * 
 * @author 梁栋
 * @version 1.0
 * @since 1.0
 */
public abstract class BidCoder {

	/**
	 * ALGORITHM 算法 <br>
	 * 可替换为以下任意一种算法,同时key值的size相应改变。
	 * 
	 * <pre>
	 * DES          		key size must be equal to 56
	 * DESede(TripleDES) 	key size must be equal to 112 or 168
	 * AES          		key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
	 * Blowfish     		key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
	 * RC2          		key size must be between 40 and 1024 bits
	 * RC4(ARCFOUR) 		key size must be between 40 and 1024 bits
	 * </pre>
	 * 
	 * 在Key toKey(byte[] key)方法中使用下述代码
	 * <code>SecretKey secretKey = new SecretKeySpec(key, ALGORITHM);</code> 替换
	 * <code>
	 * DESKeySpec dks = new DESKeySpec(key);
	 * SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
	 * SecretKey secretKey = keyFactory.generateSecret(dks);
	 * </code>
	 */

	// DESede(TripleDES)、AES、Blowfish、RC2、RC4(ARCFOUR)。

	/**
	 * 转换密钥<br>
	 * 
	 * @param key
	 * @param algorithm
	 *            算法
	 * @return
	 * @throws Exception
	 */

	private static Key toKey(byte[] key, String algorithm) throws Exception {
		SecretKey secretKey;
		if (algorithm.equals("DES")) {
			DESKeySpec dks = new DESKeySpec(key);
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithm);
			secretKey = keyFactory.generateSecret(dks);
		}
		// 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
		else {
			secretKey = new SecretKeySpec(key, algorithm);
		}
		return secretKey;
	}

	/**
	 * BASE64解密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decryptBASE64(String key) throws Exception {
		return (new BASE64Decoder()).decodeBuffer(key);
	}

	/**
	 * BASE64加密
	 * 
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static String encryptBASE64(byte[] key) throws Exception {
		return (new BASE64Encoder()).encodeBuffer(key);
	}

	/**
	 * 解密
	 * 
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] decrypt(byte[] data, String key, String algorithm) throws Exception {
		Key k = null;
		Cipher cipher = null;
		k = toKey(decryptBASE64(key), algorithm);
		try {
			cipher = Cipher.getInstance(algorithm);
			cipher.init(Cipher.DECRYPT_MODE, k);
		} catch (Exception e) {
			System.out.println(e + "   toKey 出异常了");
		}
		return cipher.doFinal(data);
	}

	/**
	 * 加密
	 * 
	 * @param data
	 * @param key
	 * @return
	 * @throws Exception
	 */
	public static byte[] encrypt(byte[] data, String key, String algorithm) throws Exception {
		Key k = toKey(decryptBASE64(key), algorithm);
		Cipher cipher = Cipher.getInstance(algorithm);
		cipher.init(Cipher.ENCRYPT_MODE, k);

		return cipher.doFinal(data);
	}

	/**
	 * 生成密钥
	 * 
	 * @return
	 * @throws Exception
	 */
	public static String initKey(String algorithm) throws Exception {
		return initKey(null, algorithm);
	}

	/**
	 * 生成密钥
	 * 
	 * @param seed
	 * @return
	 * @throws Exception
	 */
	public static String initKey(String seed, String algorithm) throws Exception {
		SecureRandom secureRandom = null;
		if (seed != null) {
			secureRandom = new SecureRandom(decryptBASE64(seed));
		} else {
			secureRandom = new SecureRandom();
		}
		KeyGenerator kg = KeyGenerator.getInstance(algorithm);
		kg.init(secureRandom);
		SecretKey secretKey = kg.generateKey();
		return encryptBASE64(secretKey.getEncoded());
	}

	public static String beginPass(String key, String method, String password) {
		String pasString = "";
		try {
			key = BidCoder.initKey(key, method);
			byte[] inputData = password.getBytes();
			inputData = BidCoder.encrypt(inputData, key, method);
			pasString = BidCoder.encryptBASE64(inputData);

		} catch (Exception e) {
			System.out.println(e + "   beginPass 出异常了");
		}

		return pasString;

	}

	public static String closePass(String key, String method, String password) throws Exception {
		String outputStr = "";
		key = BidCoder.initKey(key, method);
		// byte[] outputData =
		// BidCoder.decrypt(BidCoder.decryptBASE64(password), key, method);
		byte[] a = BidCoder.decryptBASE64(password);
		byte[] outputData = BidCoder.decrypt(a, key, method);
		outputStr = new String(outputData);
		return outputStr;
	}

	public static void main(String args[]) {
		String key = "";
		String str2 = "";
		try {
			key = BidCoder.beginPass("hello", "DES", "123");
			System.err.println(key);
			str2 = BidCoder.closePass("hello", "DES", "YTjNKKbGzJ4=");
			System.err.println(str2);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

 还烦请各位大哥帮忙看看哈~~先谢谢啦~

 

2012年12月29日 16:16
目前还没有答案

相关推荐

    关于AES加密算法在linux下解密失败的解决办法

    在Linux环境下,AES加密算法的使用可能会遇到解密失败的问题,这通常由多种原因引起,例如密钥管理不一致、编码问题或者加密/解密模式不匹配等。 在提供的代码中,可以看到一个简单的Java实现,用于AES加密和解密。...

    在Qt下实现的AES-128 CBC模式的加密解密

    AES(Advanced Encryption Standard),即高级加密标准,是目前广泛使用的对称加密算法,它提供了高效率且安全性强的数据保护。CBC模式是AES的一种工作模式,它通过前一个密文块与当前明文块异或后进行加密,增加了...

    AES加密时抛出java.security.InvalidKeyException: Illegal key size or default parameter

    该异常表示输入数据的长度不是16字节的倍数,这通常是由于AES加密算法要求输入数据必须是128位(即16字节)的倍数。为了解决这个问题,可以采用以下几种方式: 1. **数据填充**:在加密前对数据进行填充操作,使得...

    嵌入式Linux加密芯片驱动及测试程序

    它们可能支持各种加密算法,如AES(高级加密标准)、RSA(公钥加密标准)或DES(数据加密标准)等。 在这个项目中提到的"CH341"芯片,很可能是一种常见的USB-I2C/SPI桥接器,用于在PC与嵌入式设备之间进行通信。I2C...

    AES/CBC/PKCS5Padding/ 加解密

    AES(Advanced Encryption Standard)是一种广泛使用的块加密算法,它基于迭代的密码设计,提供高度的安全性。在描述中提到的“AES/CBC/PKCS5Padding”,分别代表了AES算法的不同部分: - AES:AES是高级加密标准,...

    task2_file_encrypt.rar_linux 文件加密

    在Linux下,OpenSSL库提供了AES加密的API接口,开发者可以方便地集成到自己的程序中。 5. **密钥管理** 加密后的文件必须安全存储密钥。密钥可以在环境变量中、密钥文件中或硬件安全模块(HSM)中存储。使用随机数...

    DES加密解密(适用的Windows和Linux系统),防止Linux的下解密失败工具类

    请注意,尽管DESEncrypt工具类旨在提供跨平台的一致性,但DES算法本身的安全性已经过时,对于新的应用,应优先考虑使用如AES、Blowfish或更现代的加密算法。此外,密钥管理和安全存储也是至关重要的,确保密钥的安全...

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

    问题的现象是:在Windows环境下,加解密操作正常无误,但在Linux系统中,尽管加密过程顺利,解密时却抛出异常。异常信息提示"Given final block not properly padded",这意味着在解密过程中遇到了不正确的填充。这...

    Linux网络安全技术.pdf

    例如,AES 加密算法是一种常见的对称加密算法。 4.2 非对称加密 非对称加密是一种使用一对不同的密钥来加密和解密数据的加密技术。例如,RSA 加密算法是一种常见的非对称加密算法。 Linux 网络安全技术是一个复杂...

    omap-aes.rar_V2

    Linux内核的Cryptographic API(加密API)正是为此而设计,它提供了一个统一的接口,使得各种加密算法能够在内核级别得到高效且安全的实现。本文将聚焦于Linux内核加密API的一个具体实现——omap-aes驱动,基于v2.13...

    易语言linux加密服务端

    常见的加密算法有AES、RSA等,它们能有效保护数据的隐私性和完整性。 2. **命令子程序**:命令子程序是服务端程序中的一个关键组件,它实现了特定的功能,如接收命令、执行操作等。在易语言中,命令子程序可以看作...

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

    首先,我们需要理解AES(Advanced Encryption Standard)加密算法的工作原理。AES是一种块密码,它将数据分成128位的块进行处理。在实际应用中,数据长度往往不是128位的整数倍,因此需要进行填充以达到整数倍。填充...

    dotnet 6 在 win7 系统 AES CFB 抛出不支持异常.rar

    在.NET 6中,加密操作通常通过`System.Security.Cryptography`命名空间下的类来实现,如`Aes`类,用于执行AES加密和解密。然而,某些加密模式可能在某些操作系统或旧版本的.NET框架中不受支持。 **Windows 7** 是一...

    jce_policy-8.zip

    总结来说,"jce_policy-8.zip"是用于解除Java加密算法中密钥长度限制的关键文件,特别是对于需要使用256位AES加密的场景。通过正确替换JCE政策文件,开发者可以实现更高级别的加密强度,增强应用的安全性。

    文件加密系统,文件加密系统

    常见的加密算法有对称加密(如DES、3DES、AES)和非对称加密(如RSA、ECC)。对称加密采用同一密钥进行加密和解密,速度快,适合大量数据的处理;而非对称加密则需要两个不同的密钥,一个公开,用于加密,另一个私有...

    Python-AN2Linux通过tcp或蓝牙将android通知加密同步到linux桌面

    这可能涉及到Python的加密库,如cryptography或pycryptodome,这些库提供了各种加密算法,如AES(高级加密标准)或RSA(公钥加密技术)。加密可以确保即使数据在网络中传输,也不会被未经授权的第三方解密和读取。 ...

    c#文件加密软件

    例如,使用AES加密时,首先初始化加密器,然后将文件数据按块读取并加密,最后将加密后的数据写入新文件。 6. **错误处理与安全性**:在开发过程中,必须考虑各种可能的异常情况,如文件不存在、权限不足等,并进行...

    易语言-linux加密服务端

    保密通讯支持库则是实现加密服务的核心,它包含了加密算法的实现,如常见的AES(高级加密标准)、RSA(公钥加密算法)等。这些算法能对传输的数据进行加解密,防止数据在传输过程中被窃取或篡改。服务端通过这个库与...

    简单的加密Gui程序

    3. **加密算法**:掌握至少一种常见的加密算法,如AES(高级加密标准)、DES(数据加密标准)或RSA(公钥加密算法),了解其工作原理并实现加密和解密功能。 4. **文件操作**:学习如何在Java中读取和写入文件,这...

    透明加密驱动源代码

    1. **加密算法选择**:透明加密驱动通常使用先进的加密算法,如AES(高级加密标准)、RSA或者更复杂的密码学方法,确保数据的安全性。这些算法需要快速且安全,以减少对系统性能的影响。 2. **驱动编程**:驱动程序...

Global site tag (gtag.js) - Google Analytics