題目描述

MD5(訊息摘要演算法5,Message-Digest algorithm 5)是一個廣泛使用的密碼學雜湊函數,可以計算出128位元的雜湊數值,常用於儲存密碼和確保檔案正確性。



給定一個含有數字和英文字母的字串s,當作是一個密碼,請計算並輸出其經過MD5編碼過後的值。

原題網址

https://www.hackerrank.com/challenges/java-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));
    }
}