David.Turing's blog

           

          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;
          ????}
          ????

          }

          posted on 2006-11-17 22:23 david.turing 閱讀(2215) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(110)

          我參與的團(tuán)隊(duì)

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊(cè)

          搜索

          積分與排名

          最新隨筆

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 靖安县| 灵寿县| 栾城县| 大田县| 龙南县| 尼勒克县| 祥云县| 太湖县| 敦煌市| 佛山市| 都兰县| 扬州市| 无棣县| 南华县| 阿勒泰市| 宝应县| 寿宁县| 延津县| 泉州市| 灌阳县| 江口县| 景洪市| 商丘市| 上犹县| 孟津县| 卓资县| 敦煌市| 临高县| 郸城县| 泰来县| 辛集市| 甘谷县| 井冈山市| 霍林郭勒市| 高淳县| 雷山县| 洪洞县| 金溪县| 甘肃省| 沙河市| 宁城县|