문제를 보니 아래와 같은 문구들이 적혀있었다.

k:????????????? p:SSF{??????????????????????????????????????} c:nal{eoesedofhzlkjtlznkxnphvutdvjxviyasfecm} k=key, p=plain text, c=cipher, md5(p):E6334DB90756FB6CFBA3AFE8EDA4F4C9

ex1) p: sfctf feb fifth to feb sixth everybody ctf fighting c: nnixsjvfhwixcbujrfjmzhkiqmxcosucehijdonxvrx

ex2) p:cce{abcdefghijkl} c:xkk{eoguihukmesr}

키와 평문은 비밀이고 암호문을 제공했다. 평문을 md5로 암호화한 값도 제공되어 있다.

예시로 평문과 그걸 암호화한 암호문이 적혀있다.

먼저 vigenere이 뭔지 찾아보니 암호 기법 중 하나로 키 단어와 평문을 문자 하나씩 정렬한 후 문자를 숫자화하여 키 단어의 문자와 평문의 문자를 더한 값을 암호문으로 설정하는 것이다. (키단어가 더 짧으면 계속 반복해서 추가로 이어붙임)

따라서 먼저 키 단어를 구하고 암호문에서 거꾸로 키 단어를 빼준 문자들을 나열하면 평문이 된다. 먼저 예시들을 이용해서 암호문에서 평문을 빼서 키단어를 찾아봤다. 짧은거는 먼저 손으로 일일히 해봤는데 나중에 그냥 코드를 짜서 실행했다.

#pragma warning(disable:4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
	char a[100] = { NULL };
	char b[100] = { NULL };
	char c[100] = { NULL };
	int len, i;

	gets(a);
	gets(b);

	len = strlen(b);

	for (i = 0; i < len; i++) {
		c[i] = b[i] - a[i] + 'A';
		if (c[i] >= 'A')
			printf("%c", c[i]);
		else
			printf("%c", c[i] + 26);
	}
}

코드를 짜고 보니 예시들의 키단어가 vigenerecode가 나왔다. (처음에 vigenererecode로 나온줄 알고 flag를 잘 못 구함)

따라서 키단어를 vigenerecode로 flag를 구해보니 SSF{ABABABACDEDEFGHIJIJKLMNOPQRSTTUVWXXYYZ}가 나왔다. 이 값을 그대로 mb5 암호화하니 문제에 주어진 값과 동일해서 flag라고 생각했다.


Solve

FLAG : SSF{ABABABACDEDEFGHIJIJKLMNOPQRSTTUVWXXYYZ}