Des加密ecb模式不支持向量

参考

程序报出异常

java.security.InvalidAlgorithmParameterException: ECB mode does not use an IV

程序源码

 
package com.example.imtest;

import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import android.util.Base64;

public class DESCode {

	 public static final String ALGORITHM_DES = "DES/ECB/PKCS7Padding";  
	 
	
//	public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";  
	  
	    /** 
	     * DES算法,加密 
	     * 
	     * @param data 待加密字符串 
	     * @param key  加密私钥,长度不能够小于8位 
	     * @return 加密后的字节数组,一般结合Base64编码使用 
	     * @throws CryptException 异常 
	     */  
	    public static String encode(String key,String data) throws Exception  
	    {  
	        return encode(key, data.getBytes());  
	    }  
	    /** 
	     * DES算法,加密 
	     * 
	     * @param data 待加密字符串 
	     * @param key  加密私钥,长度不能够小于8位 
	     * @return 加密后的字节数组,一般结合Base64编码使用 
	     * @throws CryptException 异常 
	     */  
	    public static String encode(String key,byte[] data) throws Exception  
	    {  
	        try  
	        {  
	            DESKeySpec dks = new DESKeySpec(key.getBytes());  
	              
	            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
	            //key的长度不能够小于8位字节  
	            Key secretKey = keyFactory.generateSecret(dks);  
	            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);  
	            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());  
	            AlgorithmParameterSpec paramSpec = iv;  
	            cipher.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);  
	              
	            byte[] bytes = cipher.doFinal(data);  
	              
	            return Base64.encodeToString(bytes, Base64.DEFAULT) ;  
	        } catch (Exception e)  
	        {  
	            throw new Exception(e);  
	        }  
	    }  
	  
	    /** 
	     * DES算法,解密 
	     * 
	     * @param data 待解密字符串 
	     * @param key  解密私钥,长度不能够小于8位 
	     * @return 解密后的字节数组 
	     * @throws Exception 异常 
	     */  
	    public static byte[] decodeBase64(String key,byte[] data) throws Exception  
	    {  
	        try  
	        {  
	            SecureRandom sr = new SecureRandom();  
	            DESKeySpec dks = new DESKeySpec(key.getBytes());  
	            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
	            //key的长度不能够小于8位字节  
	            Key secretKey = keyFactory.generateSecret(dks);  
	            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);  
	            IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());  
	            AlgorithmParameterSpec paramSpec = iv;  
	            cipher.init(Cipher.DECRYPT_MODE, secretKey,paramSpec);  
	            return cipher.doFinal(data);  
	        } catch (Exception e)  
	        {  
	            throw new Exception(e);  
	        }  
	    }  
	      
	    /** 
	     * 获取编码后的值 
	     * @param key 
	     * @param data 
	     * @return 
	     * @throws Exception 
	     */  
	    public static String decodeValue(String key,String data)   
	    {  
	        byte[] datas;  
	        String value = null;  
	        try {  
	            if(System.getProperty("os.name") != null && (System.getProperty("os.name").equalsIgnoreCase("sunos") || System.getProperty("os.name").equalsIgnoreCase("linux")))  
	            {  
	                datas = decodeBase64(key, Base64.decode(data,Base64.DEFAULT));  
	            }  
	            else  
	            {  
	                datas = decodeBase64(key, Base64.decode(data,Base64.DEFAULT));  
	            }  
	              
	            value = new String(datas);  
	        } catch (Exception e) {  
	            value = "";  
	        }  
	        return value;  
	    }   
}

解决这个异常直接去掉 IvParameterSpec 就OK了

修改后

 
package com.example.imtest;

import java.security.Key;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import android.util.Base64;

public class DESCode {

	 public static final String ALGORITHM_DES = "DES/ECB/PKCS7Padding";  
	 
	
//	public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";  
	  
	    /** 
	     * DES算法,加密 
	     * 
	     * @param data 待加密字符串 
	     * @param key  加密私钥,长度不能够小于8位 
	     * @return 加密后的字节数组,一般结合Base64编码使用 
	     * @throws CryptException 异常 
	     */  
	    public static String encode(String key,String data) throws Exception  
	    {  
	        return encode(key, data.getBytes());  
	    }  
	    /** 
	     * DES算法,加密 
	     * 
	     * @param data 待加密字符串 
	     * @param key  加密私钥,长度不能够小于8位 
	     * @return 加密后的字节数组,一般结合Base64编码使用 
	     * @throws CryptException 异常 
	     */  
	    public static String encode(String key,byte[] data) throws Exception  
	    {  
	        try  
	        {  
	            DESKeySpec dks = new DESKeySpec(key.getBytes());  
	              
	            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
	            //key的长度不能够小于8位字节  
	            Key secretKey = keyFactory.generateSecret(dks);  
	            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);  
	            cipher.init(Cipher.ENCRYPT_MODE, secretKey );  
	              
	            byte[] bytes = cipher.doFinal(data);  
	              
	            return Base64.encodeToString(bytes, Base64.DEFAULT) ;  
	        } catch (Exception e)  
	        {  
	            throw new Exception(e);  
	        }  
	    }  
	  
	    /** 
	     * DES算法,解密 
	     * 
	     * @param data 待解密字符串 
	     * @param key  解密私钥,长度不能够小于8位 
	     * @return 解密后的字节数组 
	     * @throws Exception 异常 
	     */  
	    public static byte[] decodeBase64(String key,byte[] data) throws Exception  
	    {  
	        try  
	        {  
	            SecureRandom sr = new SecureRandom();  
	            DESKeySpec dks = new DESKeySpec(key.getBytes());  
	            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
	            //key的长度不能够小于8位字节  
	            Key secretKey = keyFactory.generateSecret(dks);  
	            Cipher cipher = Cipher.getInstance(ALGORITHM_DES);  
	            cipher.init(Cipher.DECRYPT_MODE, secretKey );  
	            return cipher.doFinal(data);  
	        } catch (Exception e)  
	        {  
	            throw new Exception(e);  
	        }  
	    }  
	      
	    /** 
	     * 获取编码后的值 
	     * @param key 
	     * @param data 
	     * @return 
	     * @throws Exception 
	     */  
	    public static String decodeValue(String key,String data)   
	    {  
	        byte[] datas;  
	        String value = null;  
	        try {  
	            if(System.getProperty("os.name") != null && (System.getProperty("os.name").equalsIgnoreCase("sunos") || System.getProperty("os.name").equalsIgnoreCase("linux")))  
	            {  
	                datas = decodeBase64(key, Base64.decode(data,Base64.DEFAULT));  
	            }  
	            else  
	            {  
	                datas = decodeBase64(key, Base64.decode(data,Base64.DEFAULT));  
	            }  
	              
	            value = new String(datas);  
	        } catch (Exception e) {  
	            value = "";  
	        }  
	        return value;  
	    }   
}