以下是源代码,可编译执行的时候就会出 
java.security.InvalidKeyException:   Illegal   key   size   or   default   parameters 
at   javax.crypto.Cipher.a(DashoA12275) 
at   javax.crypto.Cipher.a(DashoA12275) 
at   javax.crypto.Cipher.a(DashoA12275) 
at   javax.crypto.Cipher.init(DashoA12275) 
at   javax.crypto.Cipher.init(DashoA12275) 
at   DESPlus. <init> (DESPlus.java:91) 
at   Test.main(Test.java:23) 
DESPlus.java:91---   
encryptCipher.init(Cipher.ENCRYPT_MODE,   key);   
请问我试用的时候出现这个问题,应该怎么解决 
¦ ¦ 
¦ ¦ DESPlus.java /** 
  *   @author         李国庆 
  *   @company       leemenz   (C)   copyright 
  *   @time             Nov   1,   2006     10:18:41   AM 
  *   @version       1.0.0.0 
  *   @package       com.des 
  */ 
package   com.des; import   java.security.*; 
import   javax.crypto.*; public   class   DESPlus   { 
  private   static   String   strDefaultKey   =   "national ";   private   Cipher   encryptCipher   =   null;   private   Cipher   decryptCipher   =   null;   /** 
    *   将byte数组转换为表示16进制值的字符串,   如:byte[]{8,18}转换为:0813,   和public   static   byte[] 
    *   hexStr2ByteArr(String   strIn)   互为可逆的转换过程 
    *   
    *   @param   arrB 
    *                         需要转换的byte数组 
    *   @return   转换后的字符串 
    *   @throws   Exception 
    *                           本方法不处理任何异常,所有异常全部抛出 
    */ 
  public   static   String   byteArr2HexStr(byte[]   arrB)   throws   Exception   { 
    int   iLen   =   arrB.length; 
    //   每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍 
    StringBuffer   sb   =   new   StringBuffer(iLen   *   2); 
    for   (int   i   =   0;   i   <   iLen;   i++)   { 
      int   intTmp   =   arrB[i]; 
      //   把负数转换为正数 
      while   (intTmp   <   0)   { 
        intTmp   =   intTmp   +   256; 
      } 
      //   小于0F的数需要在前面补0 
      if   (intTmp   <   16)   { 
        sb.append( "0 "); 
      } 
      sb.append(Integer.toString(intTmp,   16)); 
    } 
    return   sb.toString(); 
  }   /** 
    *   将表示16进制值的字符串转换为byte数组,   和public   static   String   byteArr2HexStr(byte[]   arrB) 
    *   互为可逆的转换过程 
    *   
    *   @param   strIn 
    *                         需要转换的字符串 
    *   @return   转换后的byte数组 
    *   @throws   Exception 
    *                           本方法不处理任何异常,所有异常全部抛出 
    *   @author   <a   href= "mailto:[email protected] "> LiGuoQing </a> 
    */ 
  public   static   byte[]   hexStr2ByteArr(String   strIn)   throws   Exception   { 
    byte[]   arrB   =   strIn.getBytes(); 
    int   iLen   =   arrB.length;     //   两个字符表示一个字节,所以字节数组长度是字符串长度除以2 
    byte[]   arrOut   =   new   byte[iLen   /   2]; 
    for   (int   i   =   0;   i   <   iLen;   i   =   i   +   2)   { 
      String   strTmp   =   new   String(arrB,   i,   2); 
      arrOut[i   /   2]   =   (byte)   Integer.parseInt(strTmp,   16); 
    } 
    return   arrOut; 
  }   /** 
    *   默认构造方法,使用默认密钥 
    *   
    *   @throws   Exception 
    */ 
  public   DESPlus()   throws   Exception   { 
    this(strDefaultKey); 
  }   /** 
    *   指定密钥构造方法 
    *   
    *   @param   strKey 
    *                         指定的密钥 
    *   @throws   Exception 
    */ 
  public   DESPlus(String   strKey)   throws   Exception   { 
    Security.addProvider(new   com.sun.crypto.provider.SunJCE()); 
    Key   key   =   getKey(strKey.getBytes());     encryptCipher   =   Cipher.getInstance( "DES "); 
    encryptCipher.init(Cipher.ENCRYPT_MODE,   key);     decryptCipher   =   Cipher.getInstance( "DES "); 
    decryptCipher.init(Cipher.DECRYPT_MODE,   key); 
  }   /** 
    *   加密字节数组 
    *   
    *   @param   arrB 
    *                         需加密的字节数组 
    *   @return   加密后的字节数组 
    *   @throws   Exception 
    */ 
  public   byte[]   encrypt(byte[]   arrB)   throws   Exception   { 
    return   encryptCipher.doFinal(arrB); 
  }   /** 
    *   加密字符串 
    *   
    *   @param   strIn 
    *                         需加密的字符串 
    *   @return   加密后的字符串 
    *   @throws   Exception 
    */ 
  public   String   encrypt(String   strIn)   throws   Exception   { 
    return   byteArr2HexStr(encrypt(strIn.getBytes())); 
  }   /** 
    *   解密字节数组 
    *   
    *   @param   arrB 
    *                         需解密的字节数组 
    *   @return   解密后的字节数组 
    *   @throws   Exception 
    */ 
  public   byte[]   decrypt(byte[]   arrB)   throws   Exception   { 
    return   decryptCipher.doFinal(arrB); 
  }   /** 
    *   解密字符串 
    *   
    *   @param   strIn 
    *                         需解密的字符串 
    *   @return   解密后的字符串 
    *   @throws   Exception 
    */ 
  public   String   decrypt(String   strIn)   throws   Exception   { 
    return   new   String(decrypt(hexStr2ByteArr(strIn))); 
  }   /** 
    *   从指定字符串生成密钥,密钥所需的字节数组长度为8位   不足8位时后面补0,超出8位只取前8位 
    *   
    *   @param   arrBTmp 
    *                         构成该字符串的字节数组 
    *   @return   生成的密钥 
    *   @throws   java.lang.Exception 
    */ 
  private   Key   getKey(byte[]   arrBTmp)   throws   Exception   { 
    //   创建一个空的8位字节数组(默认值为0) 
    byte[]   arrB   =   new   byte[8];     //   将原始字节数组转换为8位 
    for   (int   i   =   0;   i   <   arrBTmp.length   &&   i   <   arrB.length;   i++)   { 
      arrB[i]   =   arrBTmp[i]; 
    }     //   生成密钥 
    Key   key   =   new   javax.crypto.spec.SecretKeySpec(arrB,   "DES ");     return   key; 
  } 
} 测试程序     Test.java /** 
  *   @author         李国庆 
  *   @company       leemenz   (C)   copyright 
  *   @time             Nov   1,   2006     10:24:06   AM 
  *   @version       1.0.0.0 
  *   @package       com.des 
  */ 
package   com.des; /** 
  *   @author   Administrator 
  * 
  */ 
public   class   Test   {   /** 
    *   @param   args 
    */ 
  public   static   void   main(String[]   args)   { 
    //   TODO   Auto-generated   method   stub 
    try   { 
      String   test   =   "Hellow   Word! "; 
      //DESPlus   des   =   new   DESPlus();//默认密钥 
      DESPlus   des   =   new   DESPlus( "leemenz ");//自定义密钥 
      System.out.println( "加密前的字符: "+test); 
      System.out.println( "加密后的字符: "+des.encrypt(test)); 
      System.out.println( "解密后的字符: "+des.decrypt(des.encrypt(test))); 
    }   catch   (Exception   e)   { 
      //   TODO:   handle   exception 
      e.printStackTrace(); 
    } 
  } } 

解决方案 »

  1.   

    Illegal key size是不是作为key的字符串的长度有规定,比如是8个字节?
      

  2.   

    改后出现如此问题
    java.security.InvalidKeyException: Wrong algorithm: DES required
    at com.sun.crypto.provider.SunJCE_y.a(DashoA12275)
    at com.sun.crypto.provider.SunJCE_i.a(DashoA12275)
    at com.sun.crypto.provider.SunJCE_h.a(DashoA12275)
    at com.sun.crypto.provider.SunJCE_h.a(DashoA12275)
    at com.sun.crypto.provider.DESCipher.engineInit(DashoA12275)
    at javax.crypto.Cipher.a(DashoA12275)
    at javax.crypto.Cipher.a(DashoA12275)
    at javax.crypto.Cipher.init(DashoA12275)
    at javax.crypto.Cipher.init(DashoA12275)
    at DESPlus.<init>(DESPlus.java:91)
    at Test.main(Test.java:23)