1. 程式人生 > 實用技巧 >MD5加密解密工具

MD5加密解密工具

  1 import java.io.ByteArrayOutputStream;
  2 import java.io.UnsupportedEncodingException;
  3 import java.net.URLDecoder;
  4 import java.net.URLEncoder;
  5 import java.security.MessageDigest;
  6 
  7 /**
  8  2020年12月04日
  9  **/
 10 public class MD5_Base64 {
 11 
 12     public static void main(String[] args)  {
13 14 String text ="123456"; 15 System.out.println("md5:"+MD5_Base64.EncryptionByMD5(text)); 16 System.out.println("Base64:"+MD5_Base64.EncryptionByBase64(text)); 17 System.out.println("md5_Base64:"+MD5_Base64.EncryptionByMD5AndBase64(text)+"\n"); 18 19 String text2 =MD5_Base64.EncryptionByBase64(text);//
MTIzNDU2 20 System.out.println(MD5_Base64.decryptBase64(text2)+"\n"); 21 22 String text3 =MD5_Base64.EncryptionByMD5AndBase64(text);//4QrcOUm6Wau+VuBX8g+IPg== 23 System.out.println(MD5_Base64.decryptBase64To(text3)+"\n"); 24 25 } 26 27 private final static char
hexDigits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 28 private static char[] base64EncodeChars = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 29 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 30 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; 31 32 private static byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 34 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 35 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 36 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 }; 37 /** 38 * MD5加密 39 * @param text 40 * @return String 41 */ 42 public static String EncryptionByMD5(String text){ 43 try { 44 byte[] btInput = text.getBytes(); 45 // 獲得MD5摘要演算法的 MessageDigest 物件 46 MessageDigest mdInst = MessageDigest.getInstance("MD5"); 47 // 使用指定的位元組更新摘要 48 mdInst.update(btInput); 49 // 獲得密文 50 byte[] md = mdInst.digest(); 51 // 把密文轉換成十六進位制的字串形式 52 int j = md.length; 53 char str[] = new char[j * 2]; 54 int k = 0; 55 for (int i = 0; i < j; i++) { 56 byte byte0 = md[i]; 57 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 58 str[k++] = hexDigits[byte0 & 0xf]; 59 } 60 return new String(str); 61 } catch (Exception e) { 62 e.printStackTrace(); 63 return null; 64 } 65 66 } 67 /** 68 * MD5加密 69 * @param text 70 * @return byte[] 71 */ 72 public static byte[] EncryptionByMD5T(String text){ 73 try { 74 byte[] btInput = text.getBytes(); 75 // 獲得MD5摘要演算法的 MessageDigest 物件 76 MessageDigest mdInst = MessageDigest.getInstance("MD5"); 77 // 使用指定的位元組更新摘要 78 mdInst.update(btInput); 79 // 獲得密文 80 byte[] md = mdInst.digest(); 81 return md; 82 } catch (Exception e) { 83 e.printStackTrace(); 84 return null; 85 } 86 87 } 88 /** 89 * Base64加密 90 * @param text 91 * @return String 92 */ 93 public static String EncryptionByBase64(String text) { 94 byte[] data=text.getBytes(); 95 StringBuffer sb = new StringBuffer(); 96 int len = data.length; 97 int i = 0; 98 int b1, b2, b3; 99 100 while (i < len) { 101 b1 = data[i++] & 0xff; 102 if (i == len) { 103 sb.append(base64EncodeChars[b1 >>> 2]); 104 sb.append(base64EncodeChars[(b1 & 0x3) << 4]); 105 sb.append("=="); 106 break; 107 } 108 b2 = data[i++] & 0xff; 109 if (i == len) { 110 sb.append(base64EncodeChars[b1 >>> 2]); 111 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 112 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); 113 sb.append("="); 114 break; 115 } 116 b3 = data[i++] & 0xff; 117 sb.append(base64EncodeChars[b1 >>> 2]); 118 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 119 sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); 120 sb.append(base64EncodeChars[b3 & 0x3f]); 121 } 122 return sb.toString(); 123 } 124 125 /** 126 * Base64加密 127 * @param data 128 * @return String 129 */ 130 public static String EncryptionByBase64(byte[] data) { 131 StringBuffer sb = new StringBuffer(); 132 int len = data.length; 133 int i = 0; 134 int b1, b2, b3; 135 136 while (i < len) { 137 b1 = data[i++] & 0xff; 138 if (i == len) { 139 sb.append(base64EncodeChars[b1 >>> 2]); 140 sb.append(base64EncodeChars[(b1 & 0x3) << 4]); 141 sb.append("=="); 142 break; 143 } 144 b2 = data[i++] & 0xff; 145 if (i == len) { 146 sb.append(base64EncodeChars[b1 >>> 2]); 147 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 148 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); 149 sb.append("="); 150 break; 151 } 152 b3 = data[i++] & 0xff; 153 sb.append(base64EncodeChars[b1 >>> 2]); 154 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 155 sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); 156 sb.append(base64EncodeChars[b3 & 0x3f]); 157 } 158 return sb.toString(); 159 } 160 161 162 /** 163 * 先MD5加密,再base64加密 164 * @param text 165 * @return String 166 */ 167 public static String EncryptionByMD5AndBase64(String text){ 168 169 return EncryptionByBase64(EncryptionByMD5T(text)); 170 } 171 172 /** 173 * Base64 解密 174 * @return String 175 */ 176 public static String decryptBase64(String text) { 177 byte[] data = text.getBytes(); 178 int len = data.length; 179 ByteArrayOutputStream buf = new ByteArrayOutputStream(len); 180 int i = 0; 181 int b1, b2, b3, b4; 182 183 while (i < len) 184 { 185 186 /* b1 */ 187 do 188 { 189 b1 = base64DecodeChars[data[i++]]; 190 } 191 while (i < len && b1 == -1); 192 if (b1 == -1) 193 { 194 break; 195 } 196 197 /* b2 */ 198 do 199 { 200 b2 = base64DecodeChars[data[i++]]; 201 } 202 while (i < len && b2 == -1); 203 if (b2 == -1) 204 { 205 break; 206 } 207 buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4))); 208 209 /* b3 */ 210 do 211 { 212 b3 = data[i++]; 213 if (b3 == 61) 214 { 215 return new String(buf.toByteArray()); 216 } 217 b3 = base64DecodeChars[b3]; 218 } 219 while (i < len && b3 == -1); 220 if (b3 == -1) 221 { 222 break; 223 } 224 buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); 225 226 /* b4 */ 227 do 228 { 229 b4 = data[i++]; 230 if (b4 == 61) 231 { 232 return new String(buf.toByteArray()); 233 } 234 b4 = base64DecodeChars[b4]; 235 } 236 while (i < len && b4 == -1); 237 if (b4 == -1) 238 { 239 break; 240 } 241 buf.write((int) (((b3 & 0x03) << 6) | b4)); 242 243 } 244 245 return new String(buf.toByteArray()); 246 247 } 248 249 /** 250 * Base64 解密到MD5 251 * @return String 252 */ 253 public static String decryptBase64To(String text) { 254 byte[] data = text.getBytes(); 255 int len = data.length; 256 ByteArrayOutputStream buf = new ByteArrayOutputStream(len); 257 int i = 0; 258 int b1, b2, b3, b4; 259 260 while (i < len) 261 { 262 263 /* b1 */ 264 do 265 { 266 b1 = base64DecodeChars[data[i++]]; 267 } 268 while (i < len && b1 == -1); 269 if (b1 == -1) 270 { 271 break; 272 } 273 274 /* b2 */ 275 do 276 { 277 b2 = base64DecodeChars[data[i++]]; 278 } 279 while (i < len && b2 == -1); 280 if (b2 == -1) 281 { 282 break; 283 } 284 buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4))); 285 286 /* b3 */ 287 do 288 { 289 b3 = data[i++]; 290 if (b3 == 61) 291 { 292 byte[] br = buf.toByteArray(); 293 // 把密文轉換成十六進位制的字串形式 294 int p = br.length; 295 char str[] = new char[p * 2]; 296 int k = 0; 297 for (int r = 0; r < p; r++) { 298 byte byte0 = br[r]; 299 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 300 str[k++] = hexDigits[byte0 & 0xf]; 301 } 302 return new String(str); 303 } 304 b3 = base64DecodeChars[b3]; 305 } 306 while (i < len && b3 == -1); 307 if (b3 == -1) 308 { 309 break; 310 } 311 buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); 312 313 /* b4 */ 314 do 315 { 316 b4 = data[i++]; 317 if (b4 == 61) 318 { 319 byte[] br = buf.toByteArray(); 320 // 把密文轉換成十六進位制的字串形式 321 int p = br.length; 322 char str[] = new char[p * 2]; 323 int k = 0; 324 for (int r = 0; r < p; r++) { 325 byte byte0 = br[r]; 326 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 327 str[k++] = hexDigits[byte0 & 0xf]; 328 } 329 return new String(str); 330 } 331 b4 = base64DecodeChars[b4]; 332 } 333 while (i < len && b4 == -1); 334 if (b4 == -1) 335 { 336 break; 337 } 338 buf.write((int) (((b3 & 0x03) << 6) | b4)); 339 340 } 341 byte[] br = buf.toByteArray(); 342 // 把密文轉換成十六進位制的字串形式 343 int p = br.length; 344 char str[] = new char[p * 2]; 345 int k = 0; 346 for (int r = 0; r < p; r++) { 347 byte byte0 = br[r]; 348 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 349 str[k++] = hexDigits[byte0 & 0xf]; 350 } 351 return new String(str); 352 } 353 354 /** 355 * 網路傳輸中文UTF-8加密,防止亂碼 356 * @param text 357 * @return String 358 */ 359 public static String netEnCoderUTF8(String text){ 360 return netEnCoder(text,"UTF-8"); 361 } 362 363 /*** 364 * 網路傳輸中文UTF-8解碼 365 * @param text 366 * @return String 367 */ 368 public static String netEDeCoderUTF8(String text){ 369 return netDecoder(text,"UTF-8"); 370 } 371 372 373 /** 374 * 375 * @param text 376 * @param charsetName 字符集 377 * @return String 378 */ 379 public static String netEnCoder(String text,String charsetName){ 380 String result=null; 381 try { 382 result= URLEncoder.encode(text,charsetName); 383 } catch (UnsupportedEncodingException e) { 384 e.printStackTrace(); 385 } 386 return result; 387 } 388 389 /** 390 * 391 * @param text 392 * @param charsetName 字符集 393 * @return String 394 */ 395 public static String netDecoder(String text,String charsetName){ 396 String result=null; 397 try { 398 result= URLDecoder.decode(text,charsetName); 399 } catch (UnsupportedEncodingException e) { 400 e.printStackTrace(); 401 } 402 return result; 403 } 404 405 }