-
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
目前还没有答案
相关推荐
在Linux环境下,AES加密算法的使用可能会遇到解密失败的问题,这通常由多种原因引起,例如密钥管理不一致、编码问题或者加密/解密模式不匹配等。 在提供的代码中,可以看到一个简单的Java实现,用于AES加密和解密。...
AES(Advanced Encryption Standard),即高级加密标准,是目前广泛使用的对称加密算法,它提供了高效率且安全性强的数据保护。CBC模式是AES的一种工作模式,它通过前一个密文块与当前明文块异或后进行加密,增加了...
该异常表示输入数据的长度不是16字节的倍数,这通常是由于AES加密算法要求输入数据必须是128位(即16字节)的倍数。为了解决这个问题,可以采用以下几种方式: 1. **数据填充**:在加密前对数据进行填充操作,使得...
它们可能支持各种加密算法,如AES(高级加密标准)、RSA(公钥加密标准)或DES(数据加密标准)等。 在这个项目中提到的"CH341"芯片,很可能是一种常见的USB-I2C/SPI桥接器,用于在PC与嵌入式设备之间进行通信。I2C...
AES(Advanced Encryption Standard)是一种广泛使用的块加密算法,它基于迭代的密码设计,提供高度的安全性。在描述中提到的“AES/CBC/PKCS5Padding”,分别代表了AES算法的不同部分: - AES:AES是高级加密标准,...
在Linux下,OpenSSL库提供了AES加密的API接口,开发者可以方便地集成到自己的程序中。 5. **密钥管理** 加密后的文件必须安全存储密钥。密钥可以在环境变量中、密钥文件中或硬件安全模块(HSM)中存储。使用随机数...
请注意,尽管DESEncrypt工具类旨在提供跨平台的一致性,但DES算法本身的安全性已经过时,对于新的应用,应优先考虑使用如AES、Blowfish或更现代的加密算法。此外,密钥管理和安全存储也是至关重要的,确保密钥的安全...
问题的现象是:在Windows环境下,加解密操作正常无误,但在Linux系统中,尽管加密过程顺利,解密时却抛出异常。异常信息提示"Given final block not properly padded",这意味着在解密过程中遇到了不正确的填充。这...
例如,AES 加密算法是一种常见的对称加密算法。 4.2 非对称加密 非对称加密是一种使用一对不同的密钥来加密和解密数据的加密技术。例如,RSA 加密算法是一种常见的非对称加密算法。 Linux 网络安全技术是一个复杂...
Linux内核的Cryptographic API(加密API)正是为此而设计,它提供了一个统一的接口,使得各种加密算法能够在内核级别得到高效且安全的实现。本文将聚焦于Linux内核加密API的一个具体实现——omap-aes驱动,基于v2.13...
常见的加密算法有AES、RSA等,它们能有效保护数据的隐私性和完整性。 2. **命令子程序**:命令子程序是服务端程序中的一个关键组件,它实现了特定的功能,如接收命令、执行操作等。在易语言中,命令子程序可以看作...
首先,我们需要理解AES(Advanced Encryption Standard)加密算法的工作原理。AES是一种块密码,它将数据分成128位的块进行处理。在实际应用中,数据长度往往不是128位的整数倍,因此需要进行填充以达到整数倍。填充...
在.NET 6中,加密操作通常通过`System.Security.Cryptography`命名空间下的类来实现,如`Aes`类,用于执行AES加密和解密。然而,某些加密模式可能在某些操作系统或旧版本的.NET框架中不受支持。 **Windows 7** 是一...
总结来说,"jce_policy-8.zip"是用于解除Java加密算法中密钥长度限制的关键文件,特别是对于需要使用256位AES加密的场景。通过正确替换JCE政策文件,开发者可以实现更高级别的加密强度,增强应用的安全性。
常见的加密算法有对称加密(如DES、3DES、AES)和非对称加密(如RSA、ECC)。对称加密采用同一密钥进行加密和解密,速度快,适合大量数据的处理;而非对称加密则需要两个不同的密钥,一个公开,用于加密,另一个私有...
这可能涉及到Python的加密库,如cryptography或pycryptodome,这些库提供了各种加密算法,如AES(高级加密标准)或RSA(公钥加密技术)。加密可以确保即使数据在网络中传输,也不会被未经授权的第三方解密和读取。 ...
例如,使用AES加密时,首先初始化加密器,然后将文件数据按块读取并加密,最后将加密后的数据写入新文件。 6. **错误处理与安全性**:在开发过程中,必须考虑各种可能的异常情况,如文件不存在、权限不足等,并进行...
保密通讯支持库则是实现加密服务的核心,它包含了加密算法的实现,如常见的AES(高级加密标准)、RSA(公钥加密算法)等。这些算法能对传输的数据进行加解密,防止数据在传输过程中被窃取或篡改。服务端通过这个库与...
3. **加密算法**:掌握至少一种常见的加密算法,如AES(高级加密标准)、DES(数据加密标准)或RSA(公钥加密算法),了解其工作原理并实现加密和解密功能。 4. **文件操作**:学习如何在Java中读取和写入文件,这...
1. **加密算法选择**:透明加密驱动通常使用先进的加密算法,如AES(高级加密标准)、RSA或者更复杂的密码学方法,确保数据的安全性。这些算法需要快速且安全,以减少对系统性能的影响。 2. **驱动编程**:驱动程序...