package com.lz.core.fe.util; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import com.lz.core.fe.exception.BlankException; /** * ASE加密 * @ClassName ASEUtil.java * @author longload * @date 2016年1月13日下午1:47:27 */ public class ASEUtil { private static final String DEFAULT_CODE="utf-8"; private static Logger logger =Logger.getLogger("ASEUtil"); public static void main(String[] args) throws Exception { String content = "{'name':'李健','userId':'3b8ab8b7-510a-4837-b77e-4061976a295c'}";//要加密的字符串 String key = "cypt"; //appNbr //加密 System.out.println(content.length()+":加密前:" + content); String aa = encryptUrlStr(content, key); System.out.println("aa:"+aa); String bb="WAdxm1Bmd1Yp7yM_ns4jEO36TimCrAWKuir7SitedvWBHTO1mCqHStRxKrBxnKv8i-cGEnb-W-tr8PGUupuEzmrG7TuCfdlinOnlA5DpG3A="; System.out.println("bb:"+bb); //解密 System.out.println("解密后:" + decryptUrlStr(bb,key)); } /** * 将字符串加密成可以url传输的字符串 * @param content加密的内容 * @param key密钥 * @return * @date 2016年1月13日下午1:43:46 * @author longload */ public static String encryptUrlStr(String content, String key)throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { logger.log(Level.INFO,content); byte[] encryptResult=encrypt(content,key); logger.log(Level.INFO,"baseBefore:"+new String(encryptResult,DEFAULT_CODE)); encryptResult= Base64.getUrlEncoder().encode(encryptResult); String str =new String(encryptResult,DEFAULT_CODE); logger.log(Level.INFO,"baseAfter:"+str); return str; } /** * 将url传输的字符串解密后返回String * @param content 解密内容 * @param key 密钥 * @return * @date 2016年1月13日下午1:38:41 * @author longload * @throws BadPaddingException * @throws IllegalBlockSizeException * @throws NoSuchPaddingException * @throws NoSuchAlgorithmException * @throws InvalidKeyException * @throws UnsupportedEncodingException */ public static String decryptUrlStr(String content, String key) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{ if (content==null) { throw new BlankException("解密内容为空!"); } logger.log(Level.INFO,"debaseBefore:"+content); byte[] contentBytes=Base64.getUrlDecoder().decode(content); logger.log(Level.INFO,"debaseAfter:"+new String(contentBytes,DEFAULT_CODE)); byte[] decryptResult= decrypt(contentBytes, key); String str=new String(decryptResult,DEFAULT_CODE); logger.log(Level.INFO,"decrypt:"+str); return str; } /** * 加密 * * @param content 需要加密的内容 * @param key 加密密码 * @return * @throws NoSuchPaddingException * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException * @throws InvalidKeyException * @throws BadPaddingException * @throws IllegalBlockSizeException */ public static byte[] encrypt(String content, String key) throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { SecretKey secretKey =getKey(key); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec secretKeyspec = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 byte[] byteContent = content.getBytes(DEFAULT_CODE); cipher.init(Cipher.ENCRYPT_MODE, secretKeyspec);// 初始化 byte[] result = cipher.doFinal(byteContent); return result; // 加密 } /** * 获得解密key * @param key * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException * @date 2016年1月15日下午2:33:47 * @author longload */ public static SecretKey getKey(String key) throws NoSuchAlgorithmException, UnsupportedEncodingException { try { KeyGenerator _generator = KeyGenerator.getInstance( "AES" ); _generator.init(128, new SecureRandom(strKey.getBytes())); return _generator.generateKey(); } catch (Exception e) { throw new RuntimeException( " 初始化密钥出现异常 " ); } return _generator.generateKey(); } /**解密 * @param content 待解密内容 * @param key 解密密钥 * @return * @throws NoSuchAlgorithmException * @throws NoSuchPaddingException * @throws InvalidKeyException * @throws BadPaddingException * @throws IllegalBlockSizeException * @throws UnsupportedEncodingException */ public static byte[] decrypt(byte[] content, String key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { SecretKey secretKey =getKey(key); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES");// 创建密码器 cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);// 初始化 byte[] result = cipher.doFinal(content); return result; // 加密 } /** * 将二进制转换成16进制 * @param buf * @return */ public static String parseByte2HexStr(byte buf[]) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } /**将16进制转换为二进制 * @param hexStr * @return */ public static byte[] parseHexStr2Byte(String hexStr) { if (hexStr.length() < 1) return null; byte[] result = new byte[hexStr.length()/2]; for (int i = 0;i< hexStr.length()/2; i++) { int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16); int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16); result[i] = (byte) (high * 16 + low); } return result; } }
在windows下可用正常使用但是在Linux下将会出错
将getKey方法替换为下面部分:
public static SecretKey getKey(String key) throws NoSuchAlgorithmException, UnsupportedEncodingException { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(key.getBytes(DEFAULT_CODE)); kgen.init(128, secureRandom); return kgen.generateKey(); }
原因:
SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed (使用填充方法,使其固定)方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。
相关推荐
理解以上知识点后,开发者可以着手编写Linux下的C语言AES加密程序,结合CBC模式增强加密的安全性,并用Base64编码处理加密结果,以适应实际的使用场景。同时,这也可以作为学习密码学和C编程的实践项目,有助于深入...
windows上加解密正常,linux上加密正常,解密时发生 异常: javax.crypto.BadPaddingException: Given final block not properly padded
1. 文件加密:用户可以使用AES加密软件对单个文件或整个文件夹进行加密,确保在未经授权的情况下无法访问这些数据。 2. 文件解密:加密后的文件可以通过软件进行解密,恢复为原始可读状态。 3. 快捷加密:软件可能...
在VC中,可以使用开源库如Crypto++或者Microsoft的Cryptography API: Next Generation (CNG)来实现AES加密。 6. **保存加密结果**:将加密后的数据写入新的文件,通常这个文件是无法直接查看的,因为它是加密的。 ...
在Linux环境下,可以通过运行特定的内核模块加载命令来测试和启用AES加密引擎。例如,加载名为mtk_aes的模块,并传入16作为参数。同时,还需要加载tcrypt模块,并设置模式参数为200,以启用测试模式。此外,在...
《AES加密算法在Linux文件系统中的设计与研究》这篇论文主要探讨了如何将先进的AES(高级加密标准)加密算法应用于Linux操作系统中的文件系统,以增强文件系统的安全性,保护用户数据。文章介绍了AES加密算法的基本...
AES加密解密工具类,解决windows下和linux加密解密不同问题。
例如,首先使用AES加密敏感数据,得到的密文再用Base64编码,这样得到的字符串可以在网络上传输;在接收端,先进行Base64解码,得到原始的密文,再用同样的密钥进行AES解密,恢复原始数据。 总的来说,这个主题涵盖...
本文探讨了基于AES和SHA-256的Linux内核态数据加密方案,该方案结合AES加密算法和SHA-256哈希散列算法,实现了数据保护和密钥文件管理。该方案的关键点在于使用AES算法和SHA-256算法对数据进行加密,并使用Linux内核...
本程序用于实现AES的加密与解密,在VC2008下运行通过
普通的AES加密,以及兼容Linux以及Windows操作系统AES差异性;Android的AES假面的差异性
程序的参数格式:encrypt -i input.txt -p password.txt -o output.txt;encrypt为 input.txt 中的文本利用password.txt中的密码进行AES(CBC)加密,同时生成output.txt。
总的来说,这个资源提供了一个在Linux系统上实现AES加密算法的C语言源代码,对于学习AES算法、理解其工作原理或在项目中使用AES加密功能的开发者来说非常有价值。通过阅读和分析这个源代码,可以深入理解AES的内部...
在Linux系统中,可以使用OpenSSL库,它提供了丰富的加密函数,包括AES加密。要使用OpenSSL,需要在项目中链接libcrypto库。 以下是一个简单的AES128加密C代码示例: ```c #include <openssl/aes.h> #include ...
总之,这个"aes.rar_Linux AES_aes linux"压缩包提供了在Linux嵌入式系统中实现AES加密算法的源代码,适用于需要对数据进行安全存储和传输的场景。通过深入理解并适当地集成这些代码,开发者可以在其项目中实现高效...
在AES-CBC模式下,32位的密钥意味着使用的是256位的AES密钥,这提供了非常强的加密强度。而16位的初始化向量是每个数据块加密的初始状态,确保了即使相同的数据在不同会话中加密也会得到不同的结果。 **C语言实现:...
aes加密解密工具类,解决在linux服务加密解密异常问题。
综上所述,该研究探讨了如何在Linux环境下结合AES加密算法设计安全文件系统ASFS,通过在文件系统级别实现加密,增强了数据保护,适应了日益增长的信息安全需求。这一工作对于理解加密技术在操作系统中的应用,以及...
在这个特定的项目中,标题提到的“AES 算法实现(linux) 可移植”表明这是一个在Linux环境下用C语言编写的AES加密库,设计时考虑了跨平台的兼容性。这意味着源代码可能使用了标准C库,并避免了依赖特定操作系统提供的...
在CPP文件中实现AES加密算法,需要关注以下几点: 1. **数据类型选择**:通常使用`uint8_t`表示8位字节,`uint32_t`表示32位整数,因为AES操作主要在字节级别进行。 2. **矩阵操作**:状态矩阵可以用二维数组表示...