在Java中使用MD、SHA、MAC三种消息摘要算法实现加解密。
1.MD
package com.imooc.security;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD4Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Test;
public class ImoocMd {
private String srcStr = "imooc security md";
/**
* JDK实现MD5
*/
@Test
public void jdkMd5(){
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md.digest(srcStr.getBytes());
//将byte数组转成16进制;
String md5Str = Hex.encodeHexString(md5Bytes);
System.out.println("JDK MD5:"+md5Str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* JDK实现MD2
*/
@Test
public void jdkMd2(){
try {
MessageDigest md = MessageDigest.getInstance("MD2");
byte[] md2Bytes = md.digest(srcStr.getBytes());
//将byte数组转成16进制;
String md2Str = Hex.encodeHexString(md2Bytes);
System.out.println("JDK MD2:"+md2Str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* bc,md5
*/
@Test
public void bcMd5(){
Digest digest = new MD5Digest();
digest.update(srcStr.getBytes(), 0, srcStr.length());
byte[] md5Bytes = new byte[digest.getDigestSize()];
digest.doFinal(md5Bytes, 0);
String md5Str = org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes);
System.out.println(" BC MD5:"+md5Str);
}
/**
* bc,md4
*/
@Test
public void bcMd4(){
Digest digest = new MD4Digest();
digest.update(srcStr.getBytes(), 0, srcStr.length());
byte[] md4Bytes = new byte[digest.getDigestSize()];
digest.doFinal(md4Bytes, 0);
String md4Str = org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes);
System.out.println(" BC MD4:"+md4Str);
}
/**
* bc,md4:方法2
*/
@Test
public void bcMd42(){
try {
Security.addProvider(new BouncyCastleProvider());
MessageDigest md = MessageDigest.getInstance("MD4");
byte[] md4Bytes = md.digest(srcStr.getBytes());
//将byte数组转成16进制;
String md4Str = Hex.encodeHexString(md4Bytes);
System.out.println("BC的MD4方法2:\n BC MD4:"+md4Str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* cc,md5
*/
@Test
public void ccMd5(){
String md5Str = DigestUtils.md5Hex(srcStr.getBytes());
System.out.println("CC MD5:"+md5Str);
}
/**
* cc,md2
*/
@Test
public void ccMd2(){
String md2Str = DigestUtils.md2Hex(srcStr.getBytes());
System.out.println("CC MD2:"+md2Str);
}
}
结果:
BC的MD4方法2:
BC MD4:d4878ee1ed8379537813b3888320ad04
JDK MD2:54ade03d9765c9f0290189a2ae704ee7
JDK MD5:89048f19b72e7367b7faacfe659a8de0
BC MD4:d4878ee1ed8379537813b3888320ad04
BC MD5:89048f19b72e7367b7faacfe659a8de0
CC MD2:54ade03d9765c9f0290189a2ae704ee7
CC MD5:89048f19b72e7367b7faacfe659a8de0
2.SHA
package com.imooc.security;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.digests.SHA224Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.junit.Test;
public class ImoocSha {
private String srcStr = "imooc security sha";
/**
* 自带,SHA1
*/
@Test
public void jdkSha1(){
try {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(srcStr.getBytes());
//将byte数组转成16进制;
String sha1Str = Hex.encodeHexString(md.digest());
System.out.println("JDK SHA1:"+sha1Str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* BC SHA1的方法
*/
@Test
public void bcSha1(){
Digest digest = new SHA1Digest();
digest.update(srcStr.getBytes(), 0, srcStr.getBytes().length);
byte[] sha1Bytes = new byte[digest.getDigestSize()];
digest.doFinal(sha1Bytes, 0);
//将byte数组转成16进制;
String sha1Str = org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes);
System.out.println(" BC SHA1:"+sha1Str);
}
/**
* BC SHA2:SHA224的方法
*/
@Test
public void bcSha224(){
Digest digest = new SHA224Digest();
digest.update(srcStr.getBytes(), 0, srcStr.getBytes().length);
byte[] sha224Bytes = new byte[digest.getDigestSize()];
digest.doFinal(sha224Bytes, 0);
//将byte数组转成16进制;
String sha224Str = org.bouncycastle.util.encoders.Hex.toHexString(sha224Bytes);
System.out.println(" BC SHA224:"+sha224Str);
}
/**
* BC SHA2:SHA224的方法
*/
@Test
public void bcSha224_2(){
try {
Security.addProvider(new BouncyCastleProvider());
MessageDigest md = MessageDigest.getInstance("SHA224");
md.update(srcStr.getBytes());
//将byte数组转成16进制;
String sha224Str = Hex.encodeHexString(md.digest());
System.out.println("方法二: BC SHA224:"+sha224Str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* CC SHA1:
*/
@Test
public void ccSha1(){
String sha1 = DigestUtils.sha1Hex(srcStr.getBytes());
System.out.println("方法一: CC SHA1:"+sha1);
sha1 = DigestUtils.sha1Hex(srcStr);
System.out.println("方法二: CC SHA1:"+sha1);
}
}
结果:
JDK SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
BC SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
方法二: BC SHA224:0b71cc6f590e1d026c922a99081a14e2c58818f4047dae6db3cf3d67
方法一: CC SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
方法二: CC SHA1:8bb95fe138f7e9d993dd90bae339a45e56b72eb7
BC SHA224:0b71cc6f590e1d026c922a99081a14e2c58818f4047dae6db3cf3d67
3.MAC
package com.imooc.security;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.junit.Test;
public class ImoocHmac {
private String srcStr = "imooc security hmac";
/**
* JDK hmac消息摘要算法;
*/
@Test
public void jdkHmacMD5(){
try {
//初始化KeyGenerator;
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
//产生密钥;
SecretKey secretKey = keyGenerator.generateKey();
//获得密钥
//byte[] key = secretKey.getEncoded();
//设置密钥;
byte[] key = Hex.decodeHex(new char[]{'a','a','a','a','a','a','a','a','a','a'});
//还原密钥
SecretKey restoreSecretKey = new SecretKeySpec(key,"HmacMD5");
//实例化MAC
Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());
//初始化Mac
mac.init(restoreSecretKey);
//执行摘要;
byte[] hmacMD5Bytes = mac.doFinal(srcStr.getBytes());
//转成16进制字符串
String hmacStr = Hex.encodeHexString(hmacMD5Bytes);
System.out.println("JDK hmacMD5:"+hmacStr);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (DecoderException e) {
e.printStackTrace();
}
}
/**
* bc的hmac算法应用
*/
@Test
public void bcHmacMD5(){
Digest digest = new MD5Digest();
HMac hmac = new HMac(digest);
byte[] initHexStr = org.bouncycastle.util.encoders.Hex.decode("aaaaaaaaaa");
//初始化Mac;
hmac.init(new KeyParameter(initHexStr));
//更新Mac;
hmac.update(srcStr.getBytes(), 0, srcStr.getBytes().length);
//预设置摘要结果;
byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];
hmac.doFinal(hmacMD5Bytes, 0);
//将byte数组转成16进制;
String hmacStr = org.bouncycastle.util.encoders.Hex.toHexString(hmacMD5Bytes);
System.out.println(" BC hmacMD5:"+hmacStr);
}
}
结果:
BC hmacMD5:522b5217700cdcedd73f19bd67bad599
JDK hmacMD5:522b5217700cdcedd73f19bd67bad599