題目描述

安全雜湊演算法2(Secure Hash Algorithm 2, SHA-2)是美國國家安全局(National Security Agency, NSA)設計出來的一系列密碼學雜湊函數,它包含了六種雜湊演算法,以位元大小的不同可分為SHA-256、SHA-512、SHA-224、SHA-384、SHA-512/224和SHA-512/256。



給定一個含有數字和英文字母的字串s,請計算並輸出其經過SHA-256編碼過後的值。

原題網址

https://www.hackerrank.com/challenges/sha-256

輸入格式

輸入一個含有數字和英文字母的字串s,字串長度在6到20之間(包含6和20)。

輸出格式

輸出字串s經過SHA-256編碼過後的值。

範例輸入1

HelloWorld

範例輸出1

872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

範例輸入2

Javarmi123

範例輸出2

f1d5f8d75bb55c777207c251d07d9091dc10fe7d6682db869106aacb4b7df678

解題概念

利用java.security套件提供的MessageDigest類別,可以協助進行安全性相關的演算法計算,其中當然也包括了SHA-256的運算。使用MessageDigest類別的「getInstance」方法可以指定要產生哪種演算法的MessageDigest物件實體,接著呼叫MessageDigest物件的「digest」方法便可以計算從參數傳入的byte陣列,所以必須要將輸入的字串使用UTF-8編碼轉成byte陣列來作為參數傳入。

MessageDigest物件的「digest」方法會直接將計算出來的SHA-256結果以byte陣列的型態回傳,題目要求要以16進制的方式輸出256位元的SHA-256數值,所以還需要再寫一個簡單的轉換程式將byte陣列中的每個byte元素轉換成擁有兩位數(如果換算後只有一位數,還需要在左邊補0)16進制的文字字串,並串接在一起。最後才可以將這個16進制的256位元數字字串輸出。

參考答案

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("SHA-256");
        final byte[] sha256 = md.digest(S.getBytes("UTF-8"));
        System.out.println(bytesToHexString(sha256));
    }
}