代码如下:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import javax.crypto.*;
import java.security.Key; 
import   java.security.SecureRandom; 
import java.security.Security;
import com.sun.org.apache.xerces.internal.impl.dv.util.*;public class HmacMD5 {
          public static String encode(String plain,String password){
           KeyGenerator _generator=null;
           Base64   base64En   =   new   Base64(); 
           try{ 
           Security.addProvider(new com.sun.crypto.provider.SunJCE());
           _generator = KeyGenerator.getInstance("HmacMD5");
               _generator.init(new SecureRandom(password.getBytes())); 
                  Key key =  _generator.generateKey();
                    
           Cipher cp=Cipher.getInstance("HmacMD5");
           cp.init(Cipher.ENCRYPT_MODE, key);
           byte ptext[]= plain.getBytes("gb2312");
           byte ctext[]=cp.doFinal(ptext);
        
           String cipher = base64En.encode(ctext);
           return cipher;
         }catch(Exception e){
         System.out.println(e);
         return "";
         }
         finally{
          _generator=null;
         }
          }
          public static  String decode(String cipher,String password){
           KeyGenerator _generator1=null;
        
           Base64   base64De  =   new   Base64(); 
           try{
           Security.addProvider(new com.sun.crypto.provider.SunJCE());
           _generator1 = KeyGenerator.getInstance("HmacMD5");       
           _generator1.init(new SecureRandom(password.getBytes())); 
                   Key key =  _generator1.generateKey();                
           Cipher cp =Cipher.getInstance("HmacMD5");
           cp.init(Cipher.DECRYPT_MODE, key);
        
               byte ctext[]=base64De.decode(cipher); 
           byte ptext[] = cp.doFinal(ctext);
                  String plain =new String(ptext,"gb2312");
              
          return plain;
           }catch(Exception ee){
           System.out.println(ee);
           return "";
           }finally{
          _generator1 =null; 
           }
          }
    
          
                   public static void main(String args[]){
               try{
               
              
                  System.out.println(encode("qwertyuiop","abcdefg"));
                   System.out.println(decode(encode("qwertyuiop","abcdefg"),"abcdefg"));
                  }catch(Exception e){
                  System.out.println(e);
                  }
          }
  
}运行后提示错误:java.security.NoSuchAlgorithmException: Cannot find any provider supporting HmacMD5java.security.NoSuchAlgorithmException: Cannot find any provider supporting HmacMD5
java.security.NoSuchAlgorithmException: Cannot find any provider supporting HmacMD5请问这是什么错误,是不是在sunjce_provider.jar缺少了些文件?把HmacMD5改为DES却好使!怎么才能正常运行呢?

解决方案 »

  1.   


    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import sun.misc.BASE64Decoder;
    public class Test {
    public static final String KEY_MAC = "HmacMD5";
    public static byte[] decryptBASE64(String key) throws Exception {
    return (new BASE64Decoder()).decodeBuffer(key);
    }
    /**
     * HMAC加密
     */
    public static String encryptHMAC(byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
    Mac mac = Mac.getInstance(secretKey.getAlgorithm());
    mac.init(secretKey); return byte2hex(mac.doFinal(data));
    }
    public static void main(String[] args) {
    String key = "closewbq";
    String data = "test";
    try {
    String out = Test.encryptHMAC(data.getBytes(), key);
    System.out.println(out);
    } catch (Exception e) { }
    }
    public static String byte2hex(byte[] b) {
    String hs = "";
    String stmp = "";
    for (int n = 0; n < b.length; n++) {
    stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
    if (stmp.length() == 1)
    hs = hs + "0" + stmp;
    else
    hs = hs + stmp;
    }
    return hs.toUpperCase();
    }
    }这个程序只不过用sun的相关包,不是很好!