天天看點

Android網絡傳輸中必用的兩個加密算法:MD5 和 RSA (附java完成測試代碼)

MD5和RSA是網絡傳輸中最常用的兩個算法,了解這兩個算法原理後就能大緻知道加密是怎麼一回事了。但這兩種算法使用環境有差異,剛好互補。

一、MD5算法

首先MD5是不可逆的,隻能加密而不能解密。比如明文是yanzi1225627,得到MD5加密後的字元串是:14F2AE15259E2C276A095E7394DA0CA9  但不能由後面一大串倒推出yanzi1225627.是以可以用來存儲使用者輸入的密碼在伺服器上。現在下載下傳檔案校驗檔案是否中途被篡改也是用的它,原理參見: 無論在Android上還是pc上用java實作MD5都比較容易,因為java已經把它做到了java.security.MessageDigest裡。下面是一個MD5Util.java類:

通過下面兩行代碼調用:

/************************************MD5加密測試*****************************/

String srcString = "yanzi1225627";

System.out.println("MD5加密後 = " + MD5Util.getMD5String(srcString));

二、RSA加密

RSA是可逆的,一個字元串可以經rsa加密後,經加密後的字元串傳到對端如伺服器上,再進行解密即可。前提是伺服器知道解密的私鑰,當然這個私鑰最好不要再網絡傳輸。RSA算法描述中需要以下幾個變量:

1、p和q 是不相等的,足夠大的兩個質數。 p和q是保密的

2、n = p*q n是公開的

3、f(n) = (p-1)*(q-1)

4、e 是和f(n)互質的質數

5、計算參數d 

6、經過上面5步計算得到公鑰KU=(e,n) 私鑰KR=(d,n)

下面兩篇文章對此有清晰的描述:

下面是java實作RSAUtil.java類:

測試代碼:

/****************************RSA加密解密測試********************************/

try {

RSAUtil rsa = new RSAUtil();

String str = "yanzi1225627";

RSAPublicKey pubKey = rsa.getRSAPublicKey();

RSAPrivateKey priKey = rsa.getRSAPrivateKey();

byte[] enRsaBytes = rsa.encrypt(pubKey,str.getBytes());

String enRsaStr = new String(enRsaBytes, "UTF-8");

System.out.println("加密後==" + enRsaStr);

System.out.println("解密後==" + new String(rsa.decrypt(priKey, rsa.encrypt(pubKey,str.getBytes()))));

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

下面是執行結果:

加密後==s?ko?1@lo????BJ?iE???1Ux?Kx&??=??n

O? ?l?>?????2r?y??8v- \A??`????r?t3?-3y?hjL?M??Se?Z???????~?"??e??XZ?苜?

解密後==yanzi1225627

上面代碼需要用到一個包rsa.jar,下載下傳連結及上面的測試代碼我已打包,下載下傳連結見下:

繼續閱讀