본문 바로가기
코딩테스트 준비/JAVA 코테

백준 10930. SHA-256

by 김긍수 2021. 3. 1.

www.acmicpc.net/problem/10930

 

10930번: SHA-256

첫째 줄에 문자열 S가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다.

www.acmicpc.net

문제제목 : SHA-256

문제난이도 : 브론드2 (하)

문제유형 : 해싱

해당 문제는 오프라인 코딩테스트보다는 온라인 코딩테스트에서 나올 수 있음.

 

문제

문자열 S가 주어졌을 때, SHA-256 해시값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열 S가 주어진다. S는 알파벳 대문자와 소문자, 그리고 숫자로만 이루어져 있으며, 길이는 최대 50이다.

출력

첫째 줄에 S의 SHA-256 해시값을 출력한다.

 

코드

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;

public class BOJ10930_SHA256 {
	
	public static byte[] sha256(String msg) throws NoSuchAlgorithmException {
		MessageDigest md = MessageDigest.getInstance("SHA-256"); //객체 생성
		md.update(msg.getBytes()); // 입력값을 줄 때(String을 byte형으로 전환)
		
		return md.digest(); // 결과값 : 해쉬값 호출
	}
	
	public static String bytesToHex1(byte[] bytes) {
		StringBuilder builder = new StringBuilder();
		
		for (byte b : bytes) {
			builder.append(String.format("%02x", b));
		}
		return builder.toString();
	}

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();

		System.out.println(bytesToHex1(sha256(str)));
	}
}

 

아이디어

1. 어떤 문제인가?

 문자열에 대한 SHA-256 해시값을 구하는 문제이다.

 

2. SHA-256 해시를 어떻게 하는지 검색을 하여 찾아본다.

 문제를 풀면서 검색도 했지만, 4학년 1학기 네트워크보안이라는 과목에서 배운 것이 떠올랐다.

 물론 배웠다고해서 보지도 않고 코드를 작성한 건 아니고 그 당시 ppt를 다시 읽고 처음 배웠을 때보다 익숙한 상태로 코드를 작성했더니 더 수월한 느낌을 받았다.

추가학습

1) java.security.MessageDigest

해당 라이브러리는 SHA나 MD2, MD5 등 여러 해시 알고리즘을 제공해준다.

해시를 한 결과값은 byte형으로 반환된다.

 

2) String -> byte[]로

 str.getBytes(); //문자를 byte로 가져와서 배열[]에 byte 타입으로 넣는다.

 

3. String.format("%02x", b)

1. %d : 10진수(정수

2. %x or %X: 16진수

3. %o : 8진수

4. %f : 실수

댓글