題目描述
MD5(訊息摘要演算法5,Message-Digest algorithm 5)是一個廣泛使用的密碼學雜湊函數,可以計算出128位元的雜湊數值,常用於儲存密碼和確保檔案正確性。
給定一個含有數字和英文字母的字串s,當作是一個密碼,請計算並輸出其經過MD5編碼過後的值。
原題網址
輸入格式
輸入一個含有數字和英文字母的字串s,字串長度在6到20之間(包含6和20)。
輸出格式
輸出字串s經過MD5編碼過後的值。
範例輸入1
HelloWorld
範例輸出1
68e109f0f40ca72a15e05cc22786f8e6
範例輸入2
Javarmi123
範例輸出2
2da2d1e0ce7b4951a858ed2d547ef485
解題概念
利用java.security套件提供的MessageDigest類別,可以協助進行安全性相關的演算法計算,其中當然也包括了MD5的運算。使用MessageDigest類別的「getInstance」方法可以指定要產生哪種演算法的MessageDigest物件實體,接著呼叫MessageDigest物件的「digest」方法便可以計算從參數傳入的byte陣列,所以必須要將輸入的字串使用UTF-8編碼轉成byte陣列來作為參數傳入。
MessageDigest物件的「digest」方法會直接將計算出來的MD5結果以byte陣列的型態回傳,題目要求要以16進制的方式輸出128位元的MD5數值,所以還需要再寫一個簡單的轉換程式將byte陣列中的每個byte元素轉換成擁有兩位數(如果換算後只有一位數,還需要在左邊補0)16進制的文字字串,並串接在一起。最後才可以將這個16進制的128位元數字字串輸出。
參考答案
import java.security.MessageDigest;
import java.util.Scanner;
public class Solution {
private static String bytesToHexString(final byte[] bytes) {
final StringBuilder sb = new StringBuilder();
for (final byte b : bytes) {
if ((b & 0xF0) == 0) {
sb.append("0");
}
sb.append(Integer.toHexString(b & 0x00FF));
}
return sb.toString().toLowerCase();
}
public static void main(final String[] args) throws Exception {
final Scanner in = new Scanner(System.in);
final String S = in.next();
final MessageDigest md = MessageDigest.getInstance("MD5");
final byte[] md5 = md.digest(S.getBytes("UTF-8"));
System.out.println(bytesToHexString(md5));
}
}