public static void main(String[] args) { //t1(); /*t2();*/ //t3(); String s=new String("wanghuailou"); System.out.println("原始:"+s); System.out.println("MD5後:"+t4(s)); System.out.println("加密的:"+converMD5(s)); System.out.println("解密的:"+converMD5(converMD5(s))); }
/** * 加密解密算法 執行一次加密,兩次解密 * @param inStr * @return */ public static String converMD5(String inStr){ char[]a=inStr.toCharArray(); for (int i=0;i<a.length;i++){ // 數組a中下標爲i的值按位異或字符t a[i]=(char)(a[i]^'t'); System.out.print(a[i]+"+"); } String s=new String(a); return s; }
/** * 採用MD5加密解密 * @param t4 * @return */ public static String t4(String t4){ /** * MD5加碼,生成32md5碼 */ MessageDigest md5=null; try{ md5=MessageDigest.getInstance("MD5"); }catch (Exception e){ System.out.println(e.toString()); e.printStackTrace(); return ""; } char[]charArray=t4.toCharArray(); byte[]byteArray=new byte[charArray.length]; for (int i=0;i<charArray.length;i++) { byteArray[i] = (byte) charArray[i]; } //將摘要和密碼結合 byte[]md5Bytes=md5.digest(byteArray); //字符緩衝 StringBuffer hexValue=new StringBuffer(); //循環每個字節 for (int i=0;i<md5Bytes.length;i++){ // byte類型的數字要&0xff再賦值給int類型,其本質緣由就是想保持二進制補碼的一致性 int val=((int)md5Bytes[i])&0xff; //0x是16進制,ff是16 它的二進制是 1111 1111,把它變成16進制前面直接補位,加6*4個0 if (val<16){ // 將不足16進制的地方補上0 hexValue.append("0"); } // 將16進制添加到字符緩衝 hexValue.append(Integer.toHexString(val)); } //將字符緩衝轉換成字符串類型 return hexValue.toString(); }