기본 콘텐츠로 건너뛰기

2017 암호경진대회 2번

원본과 동일한 서명값을 만들어 내는 메시지를 구하는 문제입니다.

48bit의 해쉬함수가 사용되는데 함수를 분석해보면 16bit의 값만을 갖는 걸을 알 수 있습니다.


답안 :
0xf7a5f9a3f7a1
0x823e8c38823a
0xe58deb8be589

풀이 :
위조 하고자 하는 메시지를 다음과 같이 두었다. “Do you hate cryptology???????? Yes I do”
동일한 서명을 갖게 하기 위해서는 메시지의 빨간색 부분의 값을 조작하여 원본 메시지와 같은 값이 나오게 하면 그 이후의 문자열은 원본 메시지와 동일함으로 일치하는 서명이 나올 것으로 생각했다가능한 메시지의 값을 구하기 위해함수 F를 분석하였다분석 결과 함수 F는 48비트를 입력받아 48비트를 출력하지만구조상 16비트의 출력을 갖는 것을 확인하였다. hi+1 = X16hiMi로 계산되기 때문에, Mi를 제외한 나머지 항을 이항하여 Mi를 구하고그 값을 메시지에 넣어 서명이 동일한지 검증해봄으로써 구할 수 있었다

댓글

이 블로그의 인기 게시물

프로그래머스 - 시저 암호

public class Caesar { String caesar ( String s , int n ) { n %= 26 ; String result = "" ; char [] temp = s . toCharArray (); for ( int i = 0 ; i < temp . length ; i ++) { if ( temp [ i ]>= 'a' && temp [ i ]<= 'z' ) temp [ i ] = ( char ) (( temp [ i ]+ n )> 'z' ? ( temp [ i ]+ n - 1 )% 'z' + 'a' : ( temp [ i ]+ n )); else if ( temp [ i ]>= 'A' && temp [ i ]<= 'Z' ) temp [ i ] = ( char ) (( temp [ i ]+ n )> 'Z' ? ( temp [ i ]+ n - 1 )% 'Z' + 'A' : ( temp [ i ]+ n )); result += temp [ i ]; } return result ; } public static void main ( String [] args ) { Caesar c = new Caesar (); System . out . println ( "s는 'a B z', n은 4인 경우: " + c . caesar ( ...