【小工匠聊密码学】--消息摘要--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完全一样。

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());
}
}```

0 条评论

相关文章

NSCTF &SteinsGate&详细writeup

NSCTF "SteinsGate"详细writeup From ChaMd5安全团队核心成员 sherlly 0x00 前言 挺不错的一道题，思路值得学习，所...

33911

Elasitcsearch 底层系列 Lucene 内核解析之 Doc Value

Elasticsearch 支持行存和列存，行存用于以文档为单位顺序存储多个文档的原始内容，在 Elasitcsearch 底层系列 Lucene...

4175

Spring Application Event Example

https://github.com/xiaoheike/SpringApplicationEventExample.git

1671

Akka（6）： become/unbecome：运算行为切换

通过一段时间的学习了解，加深了一些对Akka的认识，特别是对于Akka在实际编程中的用途方面。我的想法，或者我希望利用Akka来达到的目的是这样的：作为传...

3039

3187

picasso图片缓存框架

picasso是Square公司开源的一个Android图形缓存库，地址http://square.github.io/picasso/，可以实现图片下载和缓...

3148

OpenDaylight开发-DataStoreChange监听器三种类型

OpenDaylight中的所有数据都保存在DataStore中，并且数据以树形结构存储，可参考OpenDaylight开发中的介绍。外界对DataStore的...

36910

2864

1 压缩 一般来说，计算机处理的数据都存在一些冗余度，同时数据中间，尤其是相邻数据间存在着相关性，所以可以通过一些有别于原始编码的特殊编码方式来保存数据， 使数...

4138

3336