David.Turing's blog

 

DigestUtils for MD5, SHA, RIPEMD

/**
 *    单项函数(消息摘要)工具类 
 * 
@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  任意长度字符串
     * 
@return  MD5输出128bit,字符串通过16进制编码,返回32个字符
     
*/
    
public   static  String MD5(String input)
    {
         Digest  digest 
=   new  MD5Digest();
         
        
// 正确的值应该为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));

        
// 返回的输出应该是含有32个字符的字符串,每个字符代表一个16进制(4bit),
        
// 32*4bit=128bit
         return  resStr;
        
    }

    
/**
     * SHA1散列算法
     * 
@param  input  输入是任意字符串
     * 
@return   SHA输出160bit, 经过16进制编码,输出40个字符
     
*/
    
public   static  String SHA1(String input)
    {
         Digest  digest 
=   new  SHA1Digest();
         
        
// 正确的值应该为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));

        
// 返回的输出应该是含有40个字符的字符串,每个字符代表一个16进制(4bit),
        
// 40*4bit=160bit
         return  resStr;
        
    }

    
/**
     * RIPEMD能选择不同的摘要长度
     * 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不规范,默认选择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 阅读(2041) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(107)

我参与的团队

随笔分类(126)

随笔档案(155)

文章分类(9)

文章档案(19)

相册

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜