用Java实现MD5,SHA-1等加密

来源:互联网 发布:java开发整个流程 编辑:程序博客网 时间:2024/04/28 06:02

    晕死!好不容易把文字写无了,正准备粘代码,却一不小心点错!只好再写一遍了.

    起因是参加省上的程序设计比赛,有个题目是在Java中完成使用SHA-1算法对一个字符串加密.看到这个题目第一反应就是傻眼了,之前看过一点点相关的东西,不过,都是数字签名,而且当时也没有仔细去研究,所以直接告诉自己应该先放弃此题.

    时间逐渐在过去,其它题目也基本做完了,而离比赛结束还早,连注释都改了几遍了,应该可以试试解决这个问题了.整理一个思路,应该是在java.security包中,于是,我按了F1,调出联机帮助,直接定位到了API帮助的security包中,几乎找完了所有的类,而且一个一个地深入进去查看说明,英文水平也有限,所以看个大概也就退出来了,后面像抓到救命稻草一样找一个类: Signature ,看到有update(),sign()之类的方法,也不管三七二十一了,就算是它吧.

    于是兴致勃勃地开始声明和创建对象: Signature sig=new Signature("SHA-1"); 结果输完之后发现那个红色的提示老是不消失,再一看,原来是抽象类,结果想了半天也想不通如何解决,呵呵,后面查阅才知道应该使用getInstance()方法,平时哪有这样用过啊.最后还是没办法,把那段代码放到/* ....*/中去了,还有事没事地加了些note,呵呵,那种无奈,真是不知怎么表达.

    比赛虽然过去了,但至少发现了问题所在,于是回家后查了查网上的资料,发现应该用 MessageDigest类,不过,大致使用倒是基本相同.相关的参考网址我放在后面了,谢谢这些朋友的文章. ^_^

    对于原理性的知识我就不再重复了,有兴趣的朋友可以通过后面的链接来阅读,我把我的代码贴出来:

import java.security.*;

/*
 *  TestEncrypt.java
 *  Author: MKing
 *  Last Date: 2005-11-21
 *  Description: A test progrm to encrypt a string using MD5 or SHA-1,etc.
 */

public class TestEncrypt {
   
        public TestEncrypt() {}
       
 public String Encrypt(String strSrc,String encName) {
                //parameter strSrc is a string will be encrypted,
                //parameter encName is the algorithm name will be used.
                //encName dafault to "MD5"
  MessageDigest md=null;
  String strDes=null;

  byte[] bt=strSrc.getBytes();
  try {
                        if (encName==null||encName.equals("")) {
                            encName="MD5";
                        }
   md=MessageDigest.getInstance(encName);
   md.update(bt);
                        strDes=bytes2Hex(md.digest());  //to HexString
  }
  catch (NoSuchAlgorithmException e) {
   System.out.println("Invalid algorithm.");
   return null;
  }
                return strDes;
 }

        public String bytes2Hex(byte[]bts) {
         String des="";
         String tmp=null;
         for (int i=0;i<bts.length;i++) {
                    tmp=(Integer.toHexString(bts[i] & 0xFF));
                    if (tmp.length()==1) {
                        des+="0";
                    }
                    des+=tmp;
                }
                return des;
        }
       
        public static void main(String[]args) {
            TestEncrypt te=new TestEncrypt();
            String strSrc="可以加密汉字.Oh,and english";
            System.out.println("Source String:"+strSrc);
            System.out.println("Encrypted String:");
            System.out.println("Use Def:"+te.Encrypt(strSrc,null));
            System.out.println("Use MD5:"+te.Encrypt(strSrc,"MD5"));
            System.out.println("Use SHA:"+te.Encrypt(strSrc,"SHA-1"));
            System.out.println("Use SHA-256:"+te.Encrypt(strSrc,"SHA-256"));
        }
}

参考链接如下:

http://www.cnblogs.com/sunsonbaby/archive/2004/11/04/60440.html

http://blog.donews.com/qiyadeng/archive/2005/05/28/402898.aspx

原创粉丝点击