晕死!好不容易把文字写无了,正准备粘代码,却一不小心点错!只好再写一遍了.
起因是参加省上的程序设计比赛,有个题目是在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
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