消息摘要算法是一种单向加密算法

主要用于验证数据完整性,也是数字签名的核心算法

消息鉴别:指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行对比

a.MD家族 – MD5(128位摘要信息)

MD算法的作用流程

  public class MDFamily {
private static final String str = "鲤鱼精"; public static void main(String[] args) {
jdkMD("MD5");
ccMD5();
jdkMD("MD2");
jdkMD("MD4");
bcMD4();
} public static void jdkMD(String md){
try {
if(md == "MD4"){
//在JDK中动态加入BC MD4
Security.addProvider(new BouncyCastlePQCProvider());
MessageDigest messageDigest = MessageDigest.getInstance(md);
byte[] md4 = messageDigest.digest(str.getBytes());
System.out.println("JDK "+md+":"+Hex.encodeHexString(md4));
}
//JDK中提供了MD家族中MD2和MD5的实现方式,并且他们的实现方式相同,所以转换为MD2格式只需将MD5改为MD2
MessageDigest messageDigest = MessageDigest.getInstance(md);
byte[] md5 = messageDigest.digest(str.getBytes());
//java並沒有將MD5的加密轉換為16進制,輸出的還是一個byte數組,需要手動轉換
System.out.println("JDK "+md+":"+Hex.encodeHexString(md5));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* 同样的,BC同时为我们提供了MD2和MD5的实现,如果需要实现其他两种方式,只需将MD4改为MD2、MD5即可
*/
private static void bcMD4(){
Digest digest = new MD4Digest();
//要读取的字符数组,从哪里开始读取,读取的长度
digest.update(str.getBytes(),0,str.getBytes().length);
byte[] md4Bytes = new byte[digest.getDigestSize()];
//进行摘要处理后输出的内容,输出偏移量
digest.doFinal(md4Bytes, 0);
System.out.println("BC MD4 :" +org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));
} private static void ccMD5(){
//Commons-code只对JDK进行优化,并没有自己去实现MD家族的算法,所以它并没有MD4加密
System.out.println("ccMD5:"+DigestUtils.md5Hex(str.getBytes()));
}
}

b.SHA 安全散列算法 安全散列算法 从MD算法演变而来

系列 SHA1(SHA-1 160) SHA-2(224 256 384 512)其中SHA-2

![这里写图片描述](http://img.blog.csdn.net/20170307233218733?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFjWHVhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
public class SHAArithmeti { private final static String str = "ÀðÓ㾫";
public static void main(String[] args) {
MDFamily.jdkMD("SHA");
jdkSHA1();
} private static void jdkSHA1(){
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA");
digest.update(str.getBytes());
System.out.println(Hex.encodeHexString(digest.digest()));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

c.MAC消息认证码算法:Apple的数据算法

HMAC:含有密钥的散列函数算法

    public class HMACArithmeti {
private final static String str = "鲤鱼精";
public static void main(String[] args) {
jdkHMACMD5();
bcHMacMD5();
} //由于HMAC算法带有密钥,所以算法规则和MD5 SHA相比有些变化
private static void jdkHMACMD5(){
try {
//初始化KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
//产生密钥
SecretKey secretKey = keyGenerator.generateKey();
//获得密钥
//byte[] key = secretKey.getEncoded();
//与BC方法同步
byte[] key = org.apache.commons.codec.binary.Hex.decodeHex(new char[]{'1','2','3','4','5','6'});
//还原密钥
SecretKey restoreSecretKey = new SecretKeySpec(key,"HmacMD5");
//实例化MAC
Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());
//初始化MAC
mac.init(restoreSecretKey);
//执行摘要
byte[] hMacMD5 = mac.doFinal(str.getBytes());
System.out.println("JDK HMACMD5:"+Hex.toHexString(hMacMD5));
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DecoderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} private static void bcHMacMD5(){
HMac hMac = new HMac(new MD5Digest());
hMac.init(new KeyParameter(Hex.decode("123456")));
hMac.update(str.getBytes(),0,str.getBytes().length);
byte[] hMacMD5 = new byte[hMac.getMacSize()];
hMac.doFinal(hMacMD5, 0);
System.out.println("bc HMACMD5:" + Hex.toHexString(hMacMD5));
}
}

d.其他 RipeMD Tiger Whirlpool GOST3411都是由BC提供

JAVA加解密案例源码地址:http://download.csdn.net/detail/jacxuan/9774737

JAVA加解密 -- 消息摘要算法的更多相关文章

  1. 160829、Java加解密与数字签名

    ** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...

  2. Java加解密与数字签名

    ** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...

  3. 8.Java 加解密技术系列之 PBE

    Java 加解密技术系列之 PBE 序 概念 原理 代码实现 结束语 序 前 边的几篇文章,已经讲了几个对称加密的算法了,今天这篇文章再介绍最后一种对称加密算法 — — PBE,这种加密算法,对我的认 ...

  4. 2.Java 加解密技术系列之 MD5

    Java 加解密技术系列之 MD5 序 背景 正文 结束语 序 上一篇文章中,介绍了最基础的编码方式 — — BASE64,也简单的提了一下编码的原理.这篇文章继续加解密的系列,当然也是介绍比较基础的 ...

  5. JAVA加解密 -- 数字签名算法

    数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...

  6. 60分钟搞定JAVA加解密

    从摩尔电码到小伙伴之间老师来了的暗号,加密信息无处不在.从军事到生活,加密信息的必要性也不言而喻. 今天,我们就来看看java怎么对数据进行加解密 分类 a.古典密码 -- 受限制算法:算法的保密性给 ...

  7. 10.Java 加解密技术系列之 DH

    Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...

  8. 7.java 加解密技术系列之 AES

    java 加解密技术系列之 AES 序 概念 原理 应用 代码实现 结束语 序 这篇文章继续介绍对称加密算法,至于今天的主角,不用说,也是个厉害的角色 — — AES.AES 的出现,就是为了来替代原 ...

  9. 4.Java 加解密技术系列之 HMAC

    Java 加解密技术系列之 HMAC 序 背景 正文 代码 结束语 序 上一篇文章中简单的介绍了第二种单向加密算法 — —SHA,同时也给出了 SHA-1 的 Java 代码.有这方面需求的童鞋可以去 ...

随机推荐

  1. hdu5739

    以前从来没写过求点双连通分量,现在写一下…… 这题还用到了一个叫做block forest data structure,第一次见过…… ——对于每一个点双联通分量S, 新建一个节点s, 向S中每个节 ...

  2. 隐藏tomcat版本号

    找到catalina.jar, cd /usr/local/tomcat/lib 解压catalina.jar unzip catalina.jar 会生成两个目录 修改配置文件:org/apache ...

  3. 创建展开行明细编辑表单的 CRUD 应用

    http://www.runoob.com/jeasyui/jeasyui-app-crud3.html jQuery EasyUI 应用 - 创建展开行明细编辑表单的 CRUD 应用 当切换数据网格 ...

  4. 火柴棒等式c++

    先建立一个sum数组,打表存入1—9每个数字需要的火柴棒数,然后手动二重循环0—1000的所有数字,写一个int型函数用来计算每个数字需要多少根火柴棒(当前数字%10后在sum数组的下标),然后,最后 ...

  5. DP 贪心【p2134】百日旅行

    Background 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场大考时默默的支持, ...

  6. Track Cylinder

    1 Track = 48 KB1 Cylinder = 720 KB so 1 Cylinder = 15 Tracks Read more: http://ibmmainframes.com/abo ...

  7. 自定义编写jmeter的Java测试代码

    我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","JavaV ...

  8. [UOJ164]V

    线段树真是好东西... 每个线段树节点维护四个标记:$a,b,maxa,maxb$,$(a,b)$表示对子树内的所有数执行$x'=\max(x+a,b)$,$maxa,maxb$是历史最大标记,初始时 ...

  9. NDK之HelloWord!

    使用工具:Android Studio 2.2.2 1. 配置local.properties添加NDK路径.    效果:当然,你也可以手输写进去. 2. 项目gradle.properties追加 ...

  10. [Bug]转:使用jquery的 uploadify,在谷歌浏览器上总会崩溃的解决方法

    最近做的项目使用了jquery的uploadify,但是在谷歌浏览器测试总是会出现崩溃.如: 因为是java项目. 解决的办法是: 给引入的js加上一个参数,时间戳就可以,防止缓存,使每一次都请求.( ...