用Java进行AES256-ECB-PKCS7Padding加密

来源:互联网 发布:电视猫破解阿里云os 编辑:程序博客网 时间:2024/05/16 15:08

主要代码如下:

[java] view plain copy
  1. import java.security.Security;  
  2.   
  3. import javax.crypto.Cipher;  
  4. import javax.crypto.spec.SecretKeySpec;  
  5.   
  6. import org.bouncycastle.jce.provider.BouncyCastleProvider;  
  7.   
  8. public class Encrypt {  
  9.   
  10.     public static boolean initialized = false;  
  11.       
  12.     public static final String ALGORITHM = "AES/ECB/PKCS7Padding";  
  13.       
  14.     /** 
  15.      * @param  String str  要被加密的字符串 
  16.      * @param  byte[] key  加/解密要用的长度为32的字节数组(256位)密钥 
  17.      * @return byte[]  加密后的字节数组 
  18.      */  
  19.     public static byte[] Aes256Encode(String str, byte[] key){  
  20.         initialize();  
  21.         byte[] result = null;  
  22.         try{  
  23.             Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
  24.             SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
  25.             cipher.init(Cipher.ENCRYPT_MODE, keySpec);  
  26.             result = cipher.doFinal(str.getBytes("UTF-8"));  
  27.         }catch(Exception e){  
  28.             e.printStackTrace();  
  29.         }  
  30.         return result;  
  31.     }  
  32.       
  33.     /** 
  34.      * @param  byte[] bytes  要被解密的字节数组 
  35.      * @param  byte[] key    加/解密要用的长度为32的字节数组(256位)密钥 
  36.      * @return String  解密后的字符串 
  37.      */  
  38.     public static String Aes256Decode(byte[] bytes, byte[] key){  
  39.         initialize();  
  40.         String result = null;  
  41.         try{  
  42.             Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");  
  43.             SecretKeySpec keySpec = new SecretKeySpec(key, "AES"); //生成加密解密需要的Key  
  44.             cipher.init(Cipher.DECRYPT_MODE, keySpec);  
  45.             byte[] decoded = cipher.doFinal(bytes);  
  46.             result = new String(decoded, "UTF-8");  
  47.         }catch(Exception e){  
  48.             e.printStackTrace();  
  49.         }  
  50.         return result;  
  51.     }  
  52.       
  53.     public static void initialize(){  
  54.         if (initialized) return;  
  55.         Security.addProvider(new BouncyCastleProvider());  
  56.         initialized = true;  
  57.     }  
  58. }  

可以看到,代码开头要先import Java Cryptography Extension (JCE)中的两个类——加/解密类Cipher和密钥类SecretKeySpec,以及BouncyCastle的一个开源加/解密类库中的加/解密算法提供者类BouncyCastleProvider。

PC上的Java里面只有"AES/ECB/PKCS5Padding"算法,没有"AES/ECB/PKCS7Padding"算法。故需要引入BouncyCastle的库,并给Cipher.getInstance方法传入参数"BC"来指定Java使用这个库里的加/解密算法。BouncyCastle的加/解密类库的下载地址:http://www.bouncycastle.org/latest_releases.html

在这段代码可以运行之前,还有一个问题需要解决。Java本身限制密钥的长度最多128位,而AES256需要的密钥长度是256位,因此需要到Java官网上下载一个Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files。在Java SE的下载页面下面的Additional Resources那里会有下载链接。下载后打开压缩包,里面有两个jar文件。把这两个jar文件解压到JRE目录下的lib/security文件夹,覆盖原来的文件。这样Java就不再限制密钥的长度了。

0 0
原创粉丝点击