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,下載下傳連結及上面的測試代碼我已打包,下載下傳連結見下: