JAVA加解密 -- 消息摘要算法
消息摘要算法是一种单向加密算法
主要用于验证数据完整性,也是数字签名的核心算法
消息鉴别:指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行对比
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加解密 -- 消息摘要算法的更多相关文章
- 160829、Java加解密与数字签名
** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...
- Java加解密与数字签名
** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二 ...
- 8.Java 加解密技术系列之 PBE
Java 加解密技术系列之 PBE 序 概念 原理 代码实现 结束语 序 前 边的几篇文章,已经讲了几个对称加密的算法了,今天这篇文章再介绍最后一种对称加密算法 — — PBE,这种加密算法,对我的认 ...
- 2.Java 加解密技术系列之 MD5
Java 加解密技术系列之 MD5 序 背景 正文 结束语 序 上一篇文章中,介绍了最基础的编码方式 — — BASE64,也简单的提了一下编码的原理.这篇文章继续加解密的系列,当然也是介绍比较基础的 ...
- JAVA加解密 -- 数字签名算法
数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...
- 60分钟搞定JAVA加解密
从摩尔电码到小伙伴之间老师来了的暗号,加密信息无处不在.从军事到生活,加密信息的必要性也不言而喻. 今天,我们就来看看java怎么对数据进行加解密 分类 a.古典密码 -- 受限制算法:算法的保密性给 ...
- 10.Java 加解密技术系列之 DH
Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然 ...
- 7.java 加解密技术系列之 AES
java 加解密技术系列之 AES 序 概念 原理 应用 代码实现 结束语 序 这篇文章继续介绍对称加密算法,至于今天的主角,不用说,也是个厉害的角色 — — AES.AES 的出现,就是为了来替代原 ...
- 4.Java 加解密技术系列之 HMAC
Java 加解密技术系列之 HMAC 序 背景 正文 代码 结束语 序 上一篇文章中简单的介绍了第二种单向加密算法 — —SHA,同时也给出了 SHA-1 的 Java 代码.有这方面需求的童鞋可以去 ...
随机推荐
- 一次Ubuntu下的排雷记录
起因 某天,发现一台服务器上出现了一个大量占用cpu资源的进程.尝试手动杀掉,但很快就会自动重新创建新的进程. 追查 用命令lsof -p 10316 查看其文件路径: 该进程文件夹/proc/103 ...
- python的property的用法
假设定义了一个类:C,该类必须继承自object类,有一私有变量_xclass C: def __init__(self): self.__x=None 1.现在介绍第一种使用属性的方法: 在该类中定 ...
- hdu 1054(最小点覆盖集)
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- MATLAB多项式及多项式拟合
多项式均表示为数组形式,数组元素为多项式降幂系数 1. polyval函数 求多项式在某一点或某几个点的值. p = [1,1,1];%x^2+x+1 x = [-1,0,1];y = po ...
- PDCurses 笔记(一)
之前没有接触过curse和ncurse,平时用的也都是windows系统,所以对PDCurses也挺感兴趣的.网上关于PDCurses的内容也不是很多,但是感觉上它的函数应该都是和其他操作系统里函数都 ...
- JSON格式数据的js操作
第一种方式: 使用js函数eval(); testJson=eval(testJson);是错误的转换方式. 正确的转换方式需要加(): testJson = eval("(" + ...
- POSTGRESQL 完美备份还原
1.POSTGRESQL 完美备份还原 进入到Postgresql下的bin文件夹,会看到不少的exe文件,这就是PostgreSQL内置的工具了.里面会找到pg_dump.exe.我们实际使用的就是 ...
- Vue CLI3 关闭热替换后出现的warning
用vue cli3做项目的时候如果开启了typescript的严格模式,在dev server热替换的时候往往就会打出一大堆warning,严重的影响了编译效率.官方并没有提供关闭warning的ap ...
- A - Enterprising Escape 【BFS+优先队列+map】
The Enterprise is surrounded by Klingons! Find the escape route that has the quickest exit time, and ...
- Maven学习笔记3
好了,按照笔记2的方法我们创建好一个web项目(使用maven:java项目还是java项目,web项目还是web项目,唯一的变化既是我们在pom.xml中配置了我们本应该先下载然后导入的jar包,这 ...