java加密-解密小結

加密算法能夠分爲html

雙向加密(對稱加密、不對稱加密)java

單向加密(不可逆加密)—— MD五、sha、hmac...算法

 

對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密數據庫

有: DES AES。。apache

 

不對稱加密算法使用兩把徹底不一樣但又是徹底匹配的一對鑰匙—公鑰和私鑰。在使用不對稱加密算法加密文件時,只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程數組

RSA、DSA。。安全

 

 ================ 上面的全是廢話 =============app


 主要參照http://zhangyiqian.iteye.com/blog/1470713ssh

 Md5 消息摘要5 —— MessageDigestide

 好像還有一個版本是MessageDigest四、3 ,不過固然沒有5好,如今已經被棄用。

關鍵點:

1 藉助java.security.MessageDigest,這是jdk自帶的。加密要點只有兩個:MessageDigest的update、digest方法MessageDigest比較‘單純’,只提供幾個簡單方法

2 不管要加密的數據的長短,結果長度都是固定的(32或者16)。—— 加密過程是十分快速的。據我測試,不管加密的數據的長短,加密時間幾乎同樣。

3 將byte[]組裝string有2個方法: 1 藉助 Hex ;2  本身組裝

4 md5是單向加密,原理上是能夠極難破解的,不過據說只要解密的'md5數據庫'足夠大,咱們也很快能夠反查出原始加密信息。。。

5 密碼是可能出現重複的? 就是不一樣字符串的加密結果可能同樣?

MessageDigest.getInstance("MD5"); —— 除了md5還有其餘的 SHA-1 or SHA-256 —— 不知道什麼區別。。

7 sha的加密結果長度固定,同md5.

8 通常用來加密用戶的密碼,一般咱們可能還須要對密碼加鹽或者隨機鹽,而後加密。。

不知道其底層原理,—— 某些很大的幾十幾百M下載包、文件等都是經過md5加密的(其中還有sha加密選項。。),多是其加密速度快的緣由吧!

package basic.security;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;

public class EncrypMD5 {
	
	public byte[] eccrypt(String info) throws NoSuchAlgorithmException{
		//���MD5�㷨���MessageDigest����
		MessageDigest md5 = MessageDigest.getInstance("MD5"); 
		byte[] srcBytes = info.getBytes();
		//ʹ��srcBytes����ժҪ
		md5.update(srcBytes);
		//��ɹ�ϣ���㣬�õ�result
		byte[] resultBytes = md5.digest();
		return resultBytes;
	}
	
	public static void main(String args[]) throws NoSuchAlgorithmException{
		String msg = "aaa";
		EncrypMD5 md5 = new EncrypMD5();
		byte[] b = md5.eccrypt(msg);
		//System.out.println(((b)));
		//System.out.println(new String((b)));
		//System.out.println((new Hex().encode(b))); //[B@58ea58e3: byte[]無法直接顯示成string
		
		// 將byte[]組裝string ?
		// 1 藉助 Hex
		System.out.println(new String(new Hex().encode(b)));
		
		
		// 2 本身組裝
		int i;
		StringBuffer buf = new StringBuffer(); 
	    for (int offset = 0; offset < b.length; offset++) {
	    	i = b[offset];
	    	if (i < 0) {
	    		i += 256;
	    	}
	    	if (i < 16) {
	    		buf.append("0");
	    	}
	    	// 將整型 十進制 i 轉換爲16位,用十六進制參數表示的無符號整數值的字符串表示形式。
	    	buf.append(Integer.toHexString(i)); 
	    }
	    
	    // 32位的加密
	    String md5Str = buf.toString();
	     System.out.println(""+ md5Str);
	    // 16位的加密
	     md5Str = buf.toString().substring(8,24); 
		System.out.println(""+ md5Str);
		
	}

}

  

 Base64/32     我也不知道這個什麼用。。。

1 實現藉助sun.misc.BASE64Decoder/ sun.misc.BASE32Decoder 是jdk自帶的

2 調用很是簡單:加密encode,解密是靜態方法decodeBuffer

3 不一樣於md5,加密結果隨着要加密的字符串長短不一樣而不一樣。

package basic.security;

import java.io.IOException;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class Base64Test {

	public String encode(String toEncodeContent){
		if(toEncodeContent == null){
			return null;
		}
		BASE64Encoder encoder = new BASE64Encoder();
//		BASE32Encoder encoder32 = new BASE32Encoder();
		return encoder.encode(toEncodeContent.getBytes());
	}
	
	public String decode(String toDecodeContent){
		if(toDecodeContent == null) {
			return null;
		}
		byte[] buf = null;
		try {
			buf = new BASE64Decoder().decodeBuffer(toDecodeContent);
		} catch(IOException e){
			e.printStackTrace();
		} finally {
		}
		return new String(buf);
	}
	
	public static void main(String[] args) throws Exception {
		Base64Test test = new Base64Test();
		String toEncodeContent = "I12313";
		String encodeRet = test.encode(toEncodeContent);
		System.out.println(encodeRet);
		System.out.println(test.decode(encodeRet));
	}
}

  

參考http://www.iteye.com/topic/1122076 寫得很是好!

http://723242038.iteye.com/blog/1813853 good,有清晰的圖解

對稱加密算法 DES/3DES/AES (es結尾。。)

1 主要藉助javax.crypto.包的 KeyGenerator 對稱密鑰生成器,其generateKey方法以獲取密鑰,——SecretKey 保存對稱密鑰。javax.crypto包的Cipher 負責完成加密或解密工做

2 加密 c.init(Cipher.ENCRYPT_MODE, deskey); cipherByte = c.doFinal(src);     --- ENCRYPT_MODE 即表示加密! doFinal完成加密

3 解密 c.init(Cipher.DECRYPT_MODE, deskey); cipherByte = c.doFinal(buff);    ----DECRYPT_MODE 表示解密

4 加密解密使用的是同一個deskey,——- 代表是對稱加密算法。!!!

5 比起最初的DES,3DES更爲安全.跟早期經常使用於wifi密碼加密的wes貌似。不過如今彷佛被認爲不安全,被wpa2加密了。。。

6 各個加密算法本質上有很大的實現不一樣,可是sun給咱們封裝了, 使用上區別僅僅在於keygen = KeyGenerator.getInstance("算法名字"); 其中名字的不一樣。

7 加密結果不是長度固定的,大概是加密字符越長,結果就越長。。

package basic.security;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

public class EncrypDES {
	
	//KeyGenerator 提供對稱密鑰生成器的功能,支持各類算法
	private KeyGenerator keygen;
	//SecretKey 負責保存對稱密鑰
	private SecretKey deskey;
	//Cipher負責完成加密或解密工做
	private Cipher c;
	//該字節數組負責保存加密的結果
	private byte[] cipherByte;
	
	public EncrypDES() throws NoSuchAlgorithmException, NoSuchPaddingException{
		Security.addProvider(new com.sun.crypto.provider.SunJCE());
		//實例化支持DES算法的密鑰生成器(算法名稱命名需按規定,不然拋出異常)
		keygen = KeyGenerator.getInstance("DES");
		//生成密鑰
		deskey = keygen.generateKey();
		//生成Cipher對象,指定其支持的DES算法
		c = Cipher.getInstance("DES");
	}
	
	/**
	 * 對字符串加密
	 * 
	 * @param str
	 * @return
	 * @throws InvalidKeyException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public byte[] Encrytor(String str) throws InvalidKeyException,
			IllegalBlockSizeException, BadPaddingException {
		// 根據密鑰,對Cipher對象進行初始化,ENCRYPT_MODE表示加密模式
		c.init(Cipher.ENCRYPT_MODE, deskey);
		byte[] src = str.getBytes();
		// 加密,結果保存進cipherByte
		cipherByte = c.doFinal(src);
		return cipherByte;
	}

	/**
	 * 對字符串解密
	 * 
	 * @param buff
	 * @return
	 * @throws InvalidKeyException
	 * @throws IllegalBlockSizeException
	 * @throws BadPaddingException
	 */
	public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
			IllegalBlockSizeException, BadPaddingException {
		// 根據密鑰,對Cipher對象進行初始化,DECRYPT_MODE表示加密模式
		c.init(Cipher.DECRYPT_MODE, deskey);
		cipherByte = c.doFinal(buff);
		return cipherByte;
	}

	/**
	 * @param args
	 * @throws NoSuchPaddingException 
	 * @throws NoSuchAlgorithmException 
	 * @throws BadPaddingException 
	 * @throws IllegalBlockSizeException 
	 * @throws InvalidKeyException 
	 */
	public static void main(String[] args) throws Exception {
		EncrypDES de1 = new EncrypDES();
		String msg ="lkasddad艾弗森的";
		byte[] encontent = de1.Encrytor(msg);
		byte[] decontent = de1.Decryptor(encontent);
		System.out.println("明文是:" + msg);
		System.out.println("加密後:" + new String(encontent));
		System.out.println("解密後:" + new String(decontent));
	}

}

 

非對稱加密算法 RSA/DSA(sa結尾。。)

1 代碼相似上面,只涉及jdk的java.security和javax.crypto,RSA算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,所以能夠將乘積公開做爲加密密鑰(即公鑰)—————— 即哥德巴赫猜測!!

2 關鍵代碼

初始化:   
 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
		//初始化密鑰對生成器,密鑰大小爲1024位
		keyPairGen.initialize(1024);
		//生成一個密鑰對,保存在keyPair中
		KeyPair keyPair = keyPairGen.generateKeyPair();
		//獲得私鑰
		RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();				
		//獲得公鑰
		RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();       

 加密:
//Cipher負責完成加密或解密工做,基於RSA
			Cipher cipher = Cipher.getInstance("RSA");
			//根據公鑰,對Cipher對象進行初始化
			cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 採用加密模式ENCRYPT_MODE
byte[] resultBytes = cipher.doFinal(srcBytes); 

解密
//Cipher負責完成加密或解密工做,基於RSA
Cipher cipher = Cipher.getInstance("RSA");
//根據公鑰,對Cipher對象進行初始化
cipher.init(Cipher.DECRYPT_MODE, privateKey);// 採用解密模式DECRYPT_MODE
byte[] resultBytes = cipher.doFinal(srcBytes);

1 主要有KeyPairGenerator,KeyPair,RSAPublicKey,RSAPrivateKey,Cipher

2 實際運用此算法的時候,RSAPublicKey,RSAPrivateKey同時被生成出來,保存不一樣地方--多是文件裏面

 

URLEncoding

URLDecoding

 

其餘的一些加密算法

 

 

=======================

加密算法和SSL等安全協議的關係:

ssl加密要比上面的複雜得多,它是一種協議,是一個過程,多種算法的集合。。 能夠理解爲其主要運用了RSA等算法來存儲密鑰、對稱算法來傳輸數據的ssl協議實現

通常ssl的加密過程:

個人詳細的加密過程以下 
1:client created RSA key pair 
2:client sent RSA public key to Server 
3:server generated an AES key (AESKey) 
4:server sent RSA encrypted AESKey to client 
5:client got AESKey with RSA decryption 
6:client and server use AESkey to encrypt and decrypt net data

====

SSL協議通信時候是對稱算法的,可使用AES128作期間的通信。
只有密鑰協商的時候纔是非對稱的

 

===

你的思路基本上和SSL差很少了,固然沒有SSL那麼完善。
SSL的主要優勢是防護中間人攻擊,而對稱加密還有你後來的RSA方法都沒法作到這點

===

,SSL的握手過程當中加入了HMAC,能有效防範重放攻擊 (若是採用雙向認證?)

見 http://www.iteye.com/topic/213512

http://www.iteye.com/topic/1125183 很是棒,很是詳細,惋惜沒耐心看完。貌似其過程跟我另外一篇關於ssh的文章類似

 

=======================

加密解密與SSH

 首先要明白ssh、ssl的區別

http://www.cnblogs.com/haitao-fan/archive/2012/08/31/2665211.html
http://www.cnblogs.com/FanTasYX/archive/2013/03/22/2976473.html

其實,發現和ssl差異不是很大。。。

相關文章
相關標籤/搜索