문제를 보니 아래와 같은 문구들이 적혀있었다.
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}