`

AES加密在linux下不能正常使用

    博客分类:
  • java
阅读更多
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加密算法

    理解以上知识点后,开发者可以着手编写Linux下的C语言AES加密程序,结合CBC模式增强加密的安全性,并用Base64编码处理加密结果,以适应实际的使用场景。同时,这也可以作为学习密码学和C编程的实践项目,有助于深入...

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

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

    AES加密软件 AES加密软件

    1. 文件加密:用户可以使用AES加密软件对单个文件或整个文件夹进行加密,确保在未经授权的情况下无法访问这些数据。 2. 文件解密:加密后的文件可以通过软件进行解密,恢复为原始可读状态。 3. 快捷加密:软件可能...

    AES加密BMP图片

    在VC中,可以使用开源库如Crypto++或者Microsoft的Cryptography API: Next Generation (CNG)来实现AES加密。 6. **保存加密结果**:将加密后的数据写入新的文件,通常这个文件是无法直接查看的,因为它是加密的。 ...

    MT7628 AES加密引擎使用说明

    在Linux环境下,可以通过运行特定的内核模块加载命令来测试和启用AES加密引擎。例如,加载名为mtk_aes的模块,并传入16作为参数。同时,还需要加载tcrypt模块,并设置模式参数为200,以启用测试模式。此外,在...

    AES加密算法在Linux文件系统中的设计与研究.pdf

    《AES加密算法在Linux文件系统中的设计与研究》这篇论文主要探讨了如何将先进的AES(高级加密标准)加密算法应用于Linux操作系统中的文件系统,以增强文件系统的安全性,保护用户数据。文章介绍了AES加密算法的基本...

    AES加密工具类

    AES加密解密工具类,解决windows下和linux加密解密不同问题。

    AES加密、解密(linux、window加密解密效果一致,支持中文)

    例如,首先使用AES加密敏感数据,得到的密文再用Base64编码,这样得到的字符串可以在网络上传输;在接收端,先进行Base64解码,得到原始的密文,再用同样的密钥进行AES解密,恢复原始数据。 总的来说,这个主题涵盖...

    基于AES与SHA-256的Linux内核态数据加密.pdf

    本文探讨了基于AES和SHA-256的Linux内核态数据加密方案,该方案结合AES加密算法和SHA-256哈希散列算法,实现了数据保护和密钥文件管理。该方案的关键点在于使用AES算法和SHA-256算法对数据进行加密,并使用Linux内核...

    C++实现AES加密

    本程序用于实现AES的加密与解密,在VC2008下运行通过

    AES加密方式实现

    普通的AES加密,以及兼容Linux以及Windows操作系统AES差异性;Android的AES假面的差异性

    C实现AES加密算法的使用

    程序的参数格式:encrypt -i input.txt -p password.txt -o output.txt;encrypt为 input.txt 中的文本利用password.txt中的密码进行AES(CBC)加密,同时生成output.txt。

    aes.zip_AES_R67_linux_加密

    总的来说,这个资源提供了一个在Linux系统上实现AES加密算法的C语言源代码,对于学习AES算法、理解其工作原理或在项目中使用AES加密功能的开发者来说非常有价值。通过阅读和分析这个源代码,可以深入理解AES的内部...

    aes128加密可以任意密钥长度和明文长度

    在Linux系统中,可以使用OpenSSL库,它提供了丰富的加密函数,包括AES加密。要使用OpenSSL,需要在项目中链接libcrypto库。 以下是一个简单的AES128加密C代码示例: ```c #include &lt;openssl/aes.h&gt; #include ...

    aes.rar_Linux AES_aes linux

    总之,这个"aes.rar_Linux AES_aes linux"压缩包提供了在Linux嵌入式系统中实现AES加密算法的源代码,适用于需要对数据进行安全存储和传输的场景。通过深入理解并适当地集成这些代码,开发者可以在其项目中实现高效...

    C语言AES加密解密,CBC模式,256(含测试代码且结果与Java一致)

    在AES-CBC模式下,32位的密钥意味着使用的是256位的AES密钥,这提供了非常强的加密强度。而16位的初始化向量是每个数据块加密的初始状态,确保了即使相同的数据在不同会话中加密也会得到不同的结果。 **C语言实现:...

    aes加密工具类,解决在linux服务加密解密异常问题

    aes加密解密工具类,解决在linux服务加密解密异常问题。

    AES加密算法在Linux文件系统中的设计与研究 (1).pdf

    综上所述,该研究探讨了如何在Linux环境下结合AES加密算法设计安全文件系统ASFS,通过在文件系统级别实现加密,增强了数据保护,适应了日益增长的信息安全需求。这一工作对于理解加密技术在操作系统中的应用,以及...

    AES 算法实现(linux) 可移植

    在这个特定的项目中,标题提到的“AES 算法实现(linux) 可移植”表明这是一个在Linux环境下用C语言编写的AES加密库,设计时考虑了跨平台的兼容性。这意味着源代码可能使用了标准C库,并避免了依赖特定操作系统提供的...

    AES加密算法源代码

    在CPP文件中实现AES加密算法,需要关注以下几点: 1. **数据类型选择**:通常使用`uint8_t`表示8位字节,`uint32_t`表示32位整数,因为AES操作主要在字节级别进行。 2. **矩阵操作**:状态矩阵可以用二维数组表示...

Global site tag (gtag.js) - Google Analytics