1. 程式人生 > >Android 加密 MD5和Base64簡單介紹

Android 加密 MD5和Base64簡單介紹



今天瞭解了下加密,因為我的賬號系統的密碼是沒有進行加密的,是將密碼,使用者名稱等資訊作為post引數傳遞的。

MD5加密

先看下MD5加密,網上搜索到了很多方法,我挑一個簡單的方法先展示出來,以後有興趣再深入學習。

轉載自:http://blog.csdn.net/randyjiawenjie/article/details/6589489

http://libin52008.blog.163.com/blog/static/105327187201186981459/

先了解下MD5的加密原理:

MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。

在MD5演算法中,首先需要對資訊進行填充,使其位元組長度對512求餘數的結果等於448。因此,資訊的位元組長度(Bits Length)將被擴充套件至N*512+448,即N*64+56個位元組(Bytes),N為一個正整數。填充的方法如下,在資訊的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對資訊的填充。然後再在這個結果後面附加一個以64位二進位制表示的填充前的資訊長度。經過這兩步的處理,現在的資訊位元組長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍數。這樣做的原因是為滿足後面處理中對資訊長度的要求。MD5中有四個32位被稱作連結變數(Chaining Variable)的整數引數,他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 當設定好這四個連結變數後,就開始進入演算法的四輪迴圈運算,迴圈的次數是資訊中512位資訊分組的數目。

將上面四個連結變數複製到另外四個變數中:A到a,B到b,C到c,D到d。 主迴圈有四輪(MD4只有三輪),每輪迴圈都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函式運算,然後將所得結果加上第四個變數(文字中的一個子分組和一個常數)。

再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。 以一下是每次操作中用到的四個非線性函式(每輪一個)。

F(X,Y,Z)=(X∧Y)∨(( X)∧Z)
G(X,Y,Z)=(X∧Z)∨(Y∧( Z))
H(X,Y,Z)=X?Y?Z
I(X,Y,Z)=Y?(X∨( Z))

其中,?是異或,∧是與,∨是或, 是反符號。


如果X、Y和Z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。F是一個逐位運算的函式。即,如果X,那麼Y,否則Z。函式H是逐位奇偶操作符。所有這些完成之後,將A,B,C,D分別加上a,b,c,d。然後用下一分組資料繼續執行演算法,最後的輸出是A,B,C和D的級聯。最後得到的A,B,C,D就是輸出結果,A是低位,D為高位,DCBA組成128位輸出結果。



下面是我的實現:

用AndroidStudio新建一個Project,建立一個類,名為MD5,該類可以提供將字串轉換為MD5的方法。該類的內容如下:

package com.example.md5test;

        import java.security.MessageDigest;
        import java.security.NoSuchAlgorithmException;

/**
 * 提供getMD5(string)方法
 */
public class MD5 {
    public static String getMD5(String str) throws NoSuchAlgorithmException {
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(str.getBytes());
        byte[] m = md5.digest(); //加密
        return getString(m);
    }
    private static String getString(byte[] b){
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<b.length; i++){
            sb.append(b[i]);
        }
        return sb.toString();
    }
}
若要得到一個字串string的MD5值,使用如下方法即可:

MD5.getMD5(string);

上述方法應該是32位的加密,16位的加密請參考:http://www.cnblogs.com/xuhongfei/p/4014749.html

我認為16位的加密輸出應該是sb.toString().substring(8,24)

Base64加密

轉載自:http://blog.csdn.net/huangyunzeng2008/article/details/6563711

http://blog.csdn.net/jacky_dai/article/details/4698461

http://blog.csdn.net/vicken520/article/details/9066563

Base64加密原理:

1. Base64使用A--Z,a--z,0--9,+,/ 這64個字元.
2. 編碼原理:將3個位元組轉換成4個位元組( (3 X 8) = 24 = (4 X 6) )先讀入3個位元組,每讀一個位元組,左移8位,再右移四次,每次6位,這樣就有4個位元組了.
3. 解碼原理:將4個位元組轉換成3個位元組.先讀入4個6位(用或運算),每次左移6位,再右移3次,每次8位.這樣就還原了.

    Base64是一種很常見的編碼規範,其作用是將二進位制序列轉換為人類可讀的ASCII字元序列,常用在需用通過文字協議(比如HTTP和SMTP)來傳輸二進位制資料的情況下。Base64並不是一種用於安全領域的加密解密演算法(這類演算法有DES等),儘管我們有時也聽到使用Base64來加密解密的說法,但這裡所說的加密與解密實際是指編碼(encode)和解碼(decode)的過程,其變換是非常簡單的,僅僅能夠避免資訊被直接識別。

實現:

import java.io.UnsupportedEncodingException;
import sun.misc.*;
public class Base64Test {
	// 加密
	public static String getBase64(String str){
		byte[] b = null;
		String s = null;
		try{
			b = str.getBytes("utf-8");
		}catch(UnsupportedEncodingException e){
			e.printStackTrace();
		}
		if(b != null){
			s = new BASE64Encoder().encode(b);
		}
		return s;
	}
	// 解密
	public static String getFromBase64(String s){
		byte[] b = null;
		String result = null;
		if(s != null){
			BASE64Decoder decoder = new BASE64Decoder();
			try{
				b = decoder.decodeBuffer(s);
				result = new String(b, "utf-8");
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return result;
	}
}

使用Eclipse是會報錯,內容為:The method encode(byte[]) from the type CharacterEncoder is not accessible due to restriction on required library C:\Program Files\Java\jdk1.6.0_21\jre\lib\rt.jar

解決辦法為:Window -preferences - Java - Compiler - Errors/Warnings介面的Deprecated and restricted API下。把Forbidden reference (access rules): 的規則由預設的Error改為Warning。