DigestUtils for MD5, SHA, RIPEMD
/**
?*????單項(xiàng)函數(shù)(消息摘要)工具類?
?*? @author ??david.turing
?*?@copyright?GuangZhou?BEA?Usergroup
?*? @version ?0.7
? */
package ?org.dev2dev.security.crypto.digest;
import ?java.io.File;
import ?java.io.FileNotFoundException;
import ?java.security.MessageDigest;
import ?org.bouncycastle.crypto.Digest;
import ?org.bouncycastle.crypto.digests.MD5Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD128Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD160Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD256Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD320Digest;
import ?org.bouncycastle.crypto.digests.SHA1Digest;
import ?org.bouncycastle.util.encoders.Hex;
import ?org.dev2dev.common.FileUtils;
public ? class ?DigestUtils?{
????
???? /**
?????*?MD5散列算法
?????*? @param ?input??任意長(zhǎng)度字符串
?????*? @return ?MD5輸出128bit,字符串通過16進(jìn)制編碼,返回32個(gè)字符
????? */
???? public ? static ?String?MD5(String?input)
????{
?????????Digest??digest? = ? new ?MD5Digest();
?????????
???????? // 正確的值應(yīng)該為16,即128位
????????System.out.println( " Digest?Size?= " + digest.getDigestSize() + " [bytes]? " );
?????????
???????? byte []?resBuf = new ? byte [digest.getDigestSize()];
????????
????????String??resStr;
???????? byte []??bytes? = ? new ? byte [input.getBytes().length];
????????bytes = input.getBytes();
????????digest.update(bytes,? 0 ,?bytes.length);???????
????????
????????digest.doFinal(resBuf,? 0 );
????????
????????resStr? = ? new ?String(Hex.encode(resBuf));
???????? // 返回的輸出應(yīng)該是含有32個(gè)字符的字符串,每個(gè)字符代表一個(gè)16進(jìn)制(4bit),
???????? // 32*4bit=128bit
???????? return ?resStr;
????????
????}
???? /**
?????*?SHA1散列算法
?????*? @param ?input??輸入是任意字符串
?????*? @return ??SHA輸出160bit,?經(jīng)過16進(jìn)制編碼,輸出40個(gè)字符
????? */
???? public ? static ?String?SHA1(String?input)
????{
?????????Digest??digest? = ? new ?SHA1Digest();
?????????
???????? // 正確的值應(yīng)該為20,即160位
????????System.out.println( " Digest?Size?= " + digest.getDigestSize() + " [bytes]? " );
????????
???????? byte []?resBuf = new ? byte [digest.getDigestSize()];
????????
????????String??resStr;
???????? byte []??bytes? = ? new ? byte [input.getBytes().length];
????????bytes = input.getBytes();
????????digest.update(bytes,? 0 ,?bytes.length);???????
????????
????????digest.doFinal(resBuf,? 0 );
????????
????????resStr? = ? new ?String(Hex.encode(resBuf));
???????? // 返回的輸出應(yīng)該是含有40個(gè)字符的字符串,每個(gè)字符代表一個(gè)16進(jìn)制(4bit),
???????? // 40*4bit=160bit
???????? return ?resStr;
????????
????}
???? /**
?????*?RIPEMD能選擇不同的摘要長(zhǎng)度
?????*?128b,?160b,?256b,?320b四種
?????*?
?????*? @param ?input
?????*? @param ?digestSize
?????*? @return
????? */
???? public ? static ?String?RIPEMD(String?input,? int ?digestSize)
????{
????????Digest?digest = null ;
???????? switch ?(digestSize)?{
???????? case ? 128 :
????????????digest = new ?RIPEMD128Digest();
???????????? break ;
???????? case ? 160 :
????????????digest = new ?RIPEMD160Digest();
???????????? break ;
???????? case ? 256 :
????????????digest = new ?RIPEMD256Digest();
???????????? break ;
???????? case ? 320 :
????????????digest = new ?RIPEMD320Digest();
???????????? break ;
???????? default :
???????????? // 如果指定的digestSize不規(guī)范,默認(rèn)選擇128
????????????digest = new ?RIPEMD128Digest();
???????????? break ;????????
????????}
?????????????????????
????????System.out.println( " Digest?Size= " + digest.getDigestSize() + " [bytes]? " );
????????
???????? byte []?resBuf = new ? byte [digest.getDigestSize()];
????????
????????String??resStr;
???????? byte []??bytes? = ? new ? byte [input.getBytes().length];
????????bytes = input.getBytes();
????????digest.update(bytes,? 0 ,?bytes.length);???????
????????
????????digest.doFinal(resBuf,? 0 );
????????
????????resStr? = ? new ?String(Hex.encode(resBuf));
???????? return ?resStr;
????????
????}
????
????
???? public ? static ? byte []?digestFile(String?filename,?String?digestType)
????{
????????File?infile = new ?File(filename);
???????? byte []?sign_input? = ? null ;
???????? byte []??inbytes = null ;
????????
???????? try ?{
????????????MessageDigest?digester? = ?MessageDigest.getInstance(digestType);?? // MD5,?SHA1?
????????????inbytes? = ?FileUtils.getBytesFromFile(infile);
????????????digester.update(inbytes);
????????????sign_input = digester.digest(inbytes);
????????????
????????}? catch ?(FileNotFoundException?fnf)?{
????????????System.err.println( " 輸入文件沒有找到?[ " ? + ?infile? + ? " ] " );
????????????System.exit( 1 );
????????} catch (Exception?e)
????????{
????????????e.printStackTrace();
????????}
????????
???????? return ?sign_input;
????}
????
}
?*????單項(xiàng)函數(shù)(消息摘要)工具類?
?*? @author ??david.turing
?*?@copyright?GuangZhou?BEA?Usergroup
?*? @version ?0.7
? */
package ?org.dev2dev.security.crypto.digest;
import ?java.io.File;
import ?java.io.FileNotFoundException;
import ?java.security.MessageDigest;
import ?org.bouncycastle.crypto.Digest;
import ?org.bouncycastle.crypto.digests.MD5Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD128Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD160Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD256Digest;
import ?org.bouncycastle.crypto.digests.RIPEMD320Digest;
import ?org.bouncycastle.crypto.digests.SHA1Digest;
import ?org.bouncycastle.util.encoders.Hex;
import ?org.dev2dev.common.FileUtils;
public ? class ?DigestUtils?{
????
???? /**
?????*?MD5散列算法
?????*? @param ?input??任意長(zhǎng)度字符串
?????*? @return ?MD5輸出128bit,字符串通過16進(jìn)制編碼,返回32個(gè)字符
????? */
???? public ? static ?String?MD5(String?input)
????{
?????????Digest??digest? = ? new ?MD5Digest();
?????????
???????? // 正確的值應(yīng)該為16,即128位
????????System.out.println( " Digest?Size?= " + digest.getDigestSize() + " [bytes]? " );
?????????
???????? byte []?resBuf = new ? byte [digest.getDigestSize()];
????????
????????String??resStr;
???????? byte []??bytes? = ? new ? byte [input.getBytes().length];
????????bytes = input.getBytes();
????????digest.update(bytes,? 0 ,?bytes.length);???????
????????
????????digest.doFinal(resBuf,? 0 );
????????
????????resStr? = ? new ?String(Hex.encode(resBuf));
???????? // 返回的輸出應(yīng)該是含有32個(gè)字符的字符串,每個(gè)字符代表一個(gè)16進(jìn)制(4bit),
???????? // 32*4bit=128bit
???????? return ?resStr;
????????
????}
???? /**
?????*?SHA1散列算法
?????*? @param ?input??輸入是任意字符串
?????*? @return ??SHA輸出160bit,?經(jīng)過16進(jìn)制編碼,輸出40個(gè)字符
????? */
???? public ? static ?String?SHA1(String?input)
????{
?????????Digest??digest? = ? new ?SHA1Digest();
?????????
???????? // 正確的值應(yīng)該為20,即160位
????????System.out.println( " Digest?Size?= " + digest.getDigestSize() + " [bytes]? " );
????????
???????? byte []?resBuf = new ? byte [digest.getDigestSize()];
????????
????????String??resStr;
???????? byte []??bytes? = ? new ? byte [input.getBytes().length];
????????bytes = input.getBytes();
????????digest.update(bytes,? 0 ,?bytes.length);???????
????????
????????digest.doFinal(resBuf,? 0 );
????????
????????resStr? = ? new ?String(Hex.encode(resBuf));
???????? // 返回的輸出應(yīng)該是含有40個(gè)字符的字符串,每個(gè)字符代表一個(gè)16進(jìn)制(4bit),
???????? // 40*4bit=160bit
???????? return ?resStr;
????????
????}
???? /**
?????*?RIPEMD能選擇不同的摘要長(zhǎng)度
?????*?128b,?160b,?256b,?320b四種
?????*?
?????*? @param ?input
?????*? @param ?digestSize
?????*? @return
????? */
???? public ? static ?String?RIPEMD(String?input,? int ?digestSize)
????{
????????Digest?digest = null ;
???????? switch ?(digestSize)?{
???????? case ? 128 :
????????????digest = new ?RIPEMD128Digest();
???????????? break ;
???????? case ? 160 :
????????????digest = new ?RIPEMD160Digest();
???????????? break ;
???????? case ? 256 :
????????????digest = new ?RIPEMD256Digest();
???????????? break ;
???????? case ? 320 :
????????????digest = new ?RIPEMD320Digest();
???????????? break ;
???????? default :
???????????? // 如果指定的digestSize不規(guī)范,默認(rèn)選擇128
????????????digest = new ?RIPEMD128Digest();
???????????? break ;????????
????????}
?????????????????????
????????System.out.println( " Digest?Size= " + digest.getDigestSize() + " [bytes]? " );
????????
???????? byte []?resBuf = new ? byte [digest.getDigestSize()];
????????
????????String??resStr;
???????? byte []??bytes? = ? new ? byte [input.getBytes().length];
????????bytes = input.getBytes();
????????digest.update(bytes,? 0 ,?bytes.length);???????
????????
????????digest.doFinal(resBuf,? 0 );
????????
????????resStr? = ? new ?String(Hex.encode(resBuf));
???????? return ?resStr;
????????
????}
????
????
???? public ? static ? byte []?digestFile(String?filename,?String?digestType)
????{
????????File?infile = new ?File(filename);
???????? byte []?sign_input? = ? null ;
???????? byte []??inbytes = null ;
????????
???????? try ?{
????????????MessageDigest?digester? = ?MessageDigest.getInstance(digestType);?? // MD5,?SHA1?
????????????inbytes? = ?FileUtils.getBytesFromFile(infile);
????????????digester.update(inbytes);
????????????sign_input = digester.digest(inbytes);
????????????
????????}? catch ?(FileNotFoundException?fnf)?{
????????????System.err.println( " 輸入文件沒有找到?[ " ? + ?infile? + ? " ] " );
????????????System.exit( 1 );
????????} catch (Exception?e)
????????{
????????????e.printStackTrace();
????????}
????????
???????? return ?sign_input;
????}
????
}
posted on 2006-11-17 22:23 david.turing 閱讀(2215) 評(píng)論(0) 編輯 收藏