加密解密的一些知识

     一直对加密和解密有着某种神秘感,这个周末决定好好学习一下。加密是以某种算法来改变原来的信息,使未得到授权的用户即使获得已加密的信息,也无法了解原来的信息内容。可分为单向加密和双向加密,其中双向加密有两种,对称加密和非对称加密。

 

     单向加密是对信息进行摘要计算,不能通过算法生成明文。双向加密是加密成密文后,得到秘钥可以还原成明文。有一些观点认为单向加密不属于加密算法,它只能对信息计算摘要,我们不去讨论这个问题。

 

     一般来说单向加密算法有MD5,SHA,HMAC几种,BASE64是编码算法,不是加密算法,有的地方有可能认为这是一种加密算法,特此说明一下。MD5,SHA和HMAC是非可逆算法,就是说无法解密的加密算法,但是这几种算法加密并不可靠,有很多网站提供了密码破解服务,比如,破解MD5加密信息的网站有很多很多,如http://www.cmd5.com/. 

 

MD5(Message DIGEST ALGORITHM 5),叫做信息摘要算法,可用于文件校验:

   java代码如下:

   

public static void main(String[] args) throws Exception {
		String name = "davidyang013@gmail.com";
		byte[] data = name.getBytes();
		System.out.println(byte2hex(getMD5(data)));
}

public static byte[] getMD5(byte[] data) throws Exception {
		MessageDigest md5 = MessageDigest.getInstance("MD5");
		md5.update(data);
		return md5.digest();
}

//binary to hexdecimal 
public static String byte2hex(byte[] b) {
		String hs = "";
		String stmp = "";
		for (int n = 0; n < b.length; n++) {
			stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
			if (stmp.length() == 1) {
				hs = hs + "0" + stmp;
			} else {
				hs = hs + stmp;
			}
		}
		return hs.toUpperCase();
}
 

 

 

   输出是:

    

0BFA45D98A1F0856A4261B32901A0B67
 

 

 

    python代码可能会简单一点:

    

import md5

hash = md5.new()
hash.update("davidyang013@gmail.com")
hash.hexdigest()
 

 

    

    他们的输出是一样的,java的代码是大写的,python是小写的,可以去调整一下。

    MD5算法原理,可参考http://blog.csdn.net/forgotaboutgirl/article/details/7258109

 

    

    SHA(Secure Hash Algorithm),叫做安全散列算法,可作为数字签名,广泛应用于电子商务等信息安全领域,虽然和MD5一样都被破解了,但比MD5要安全一点。

java代码:

   

     

public static void main(String[] args) throws Exception {
		String name = "davidyang013@gmail.com";
		byte[] data = name.getBytes();
		System.out.println("SHA-1:" + byte2hex(getSHA(data)));
}

public static byte[] getSHA(byte[] data) throws Exception {
		MessageDigest sha = MessageDigest.getInstance("SHA-1");
		sha.update(data);
		return sha.digest();
}
 

 

 

   输出结果是:

   

SHA-1:A6DDBADE1F91D2A30CE48244528DFED5BD9FB039
 

 

    Python代码:

    

import sha

hash = sha.new()
hash.update("davidyang013@gamil.com")
hash.hexdigest()
 

 

 

   HMAC(Hash Message Authentication Code),叫做散列消息鉴别吗,基于秘钥的Hash算法的认证协议。实现原理是,用公开函数和秘钥产生一个固定长度的值(即MAC)作为认证标识,用它来鉴别消息的完整性。MAC算法可选一下几种,HmacMD5,hmacSHA1,hmacSHA256,hmacSHA512.

java代码如下:

  

    

public static void main(String[] args) throws Exception {
		String name = "davidyang013@gmail.com";
		byte[] data = name.getBytes();
		
		String hmacKey = initMacKey();
		System.out.println("encrypted key :" + hmacKey);
		System.out.println("HMAC:" + byte2hex(getHMAC(data,hmacKey)));
	}

//initialize
public static String initMacKey() throws Exception {  
	    KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");  
	  
	    SecretKey secretKey = keyGenerator.generateKey();  
	    return encryptBASE64(secretKey.getEncoded());  
	}  

//get encrypted content
public static byte[] getHMAC(byte[] data, String key) throws Exception {  
	  
	    SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), "HmacMD5");  
	    Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
	    mac.init(secretKey);  
	  
	    return mac.doFinal(data);  
	  
	}  

public static String encryptBASE64(byte[] key) throws Exception {  
        return (new BASE64Encoder()).encodeBuffer(key);  
    } 

 

 

  HMAC不同于MD5和SHA的地方在于,它有一个秘钥,增强了数据传输过程中的安全性。

 

   未完待续。。。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值