天天看點

【Java小工匠聊密碼學】--消息摘要--RIPEMD算法

1、什麼是RIPEMD

RIPEMD(RACE Integrity Primitives Evaluation Message Digest,RACE原始完整性校驗消息摘要,是Hans Dobbertin等3人在md4,md5的基礎上,于1996年提出來的。算法共有4個标準128、160、256和320,其對應輸出長度分别為16位元組、20位元組、32位元組和40位元組。不過,讓人難以緻信的是RIPEMD的設計者們根本就沒有真正設計256和320位這2種标準,他們隻是在128位和160位的基礎上,修改了初始參數和s-box來達到輸出為256和320位的目的。是以,256位的強度和128相當,而320位的強度和160位相當。RIPEMD建立在md的基礎之上,是以,其添加資料的方式和md5完全一樣。

2、RIPEMD 應用案例

比特币在生成位址算法中,使用了該算法。

3、RIPEMD算法實作

package lzf.cipher.bc;

import java.nio.charset.Charset;

import org.bouncycastle.crypto.Digest;
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.util.encoders.Hex;

/**
 * @author Java小工匠
 */
public class BCRIPEMDUtils {

    public static String ripemd128(byte[] bytes) {
        Digest digest = new RIPEMD128Digest();
        digest.update(bytes, 0, bytes.length);
        byte[] rsData = new byte[digest.getDigestSize()];
        digest.doFinal(rsData, 0);
        return Hex.toHexString(rsData);
    }

    public static String ripemd160(byte[] bytes) {
        Digest digest = new RIPEMD160Digest();
        digest.update(bytes, 0, bytes.length);
        byte[] rsData = new byte[digest.getDigestSize()];
        digest.doFinal(rsData, 0);
        return Hex.toHexString(rsData);
    }

    public static String ripemd256(byte[] bytes) {
        Digest digest = new RIPEMD256Digest();
        digest.update(bytes, 0, bytes.length);
        byte[] rsData = new byte[digest.getDigestSize()];
        digest.doFinal(rsData, 0);
        return Hex.toHexString(rsData);
    }

    public static String ripemd320(byte[] bytes) {
        Digest digest = new RIPEMD320Digest();
        digest.update(bytes, 0, bytes.length);
        byte[] rsData = new byte[digest.getDigestSize()];
        digest.doFinal(rsData, 0);
        return Hex.toHexString(rsData);
    }

    public static void main(String[] args) {
        byte[] bytes = "java小工匠".getBytes(Charset.forName("UTF-8"));
        String ripemd128 = ripemd128(bytes);
        System.out.println("ripemd128:" + ripemd128 + ",lengh=" + ripemd128.length());
        String ripemd160 = ripemd160(bytes);
        System.out.println("ripemd160:" + ripemd160 + ",lengh=" + ripemd160.length());
        String ripemd256 = ripemd256(bytes);
        System.out.println("ripemd256:" + ripemd256 + ",lengh=" + ripemd256.length());
        String ripemd320 = ripemd320(bytes);
        System.out.println("ripemd320:" + ripemd320 + ",lengh=" + ripemd320.length());
    }
}
           

如果讀完覺得有收獲的話,歡迎點贊、關注、加公衆号【小工匠技術圈】

個人公衆号,歡迎關注,查閱更多精彩曆史!

image