Underhanded C Contest 의 정신으로 Underhanded Code Contest를 시작하고 있습니다. 이 콘테스트의 목적은 일부 코드를 간단하게 구현하는 동시에 사악한 버그를 미묘하게 숨기는 것입니다.
콘테스트
당신은 미국 스파이 기관의 IT 부서에서 일하는 비밀 러시아 사마귀입니다. 미국 상사가 방금 비밀 메시지 암호화에 사용할 암호 해싱 알고리즘을 구현하도록 요청했습니다.
상사는 다음 기능을 구현하기를 원합니다.
f: String -> byte[16]
암호를 AES 키로 사용하기에 적합한 16 바이트 수량으로 변환합니다. 상사는 안전한 기능을 원합니다.이 맥락에서 다른 암호 문자열은 압도적 인 확률로 다른 결과를 생성해야 함을 의미합니다. 예를 들어 입력 의 md5 해시를 반환하면 간단한 구현이 f
됩니다.
물론 러시아 스파이 기관 의 실제 상사는이 과정을 파괴하기를 원할 것입니다. 귀하의 임무는 f
러시아인이에서 반환 한 키를 사용하여 암호화 된 모든 비밀 메시지를 해독 할 수 있도록 구현 하는 것 f
입니다.
그렇게하려면 f
2 ^ 128 개의 가능한 출력 중 작은 서브 세트 만 리턴하도록 구현해야합니다 . 특히, f
러시아인이 해독하려는 각 암호화 된 메시지에 대해 올바른 키를 쉽게 무차별 검색 할 수 있도록 최대 2 ^ 16 개의 서로 다른 결과를 반환해야합니다.
그러나 간첩 행위에는 사형이 따른다는 점을 명심하십시오. 잡히지 않으려면 함수 f
가 적어도 2 ^ 8 개의 서로 다른 결과를 생성해야하므로 몇 개의 출력에 대한 커서 검사가 f
중복을 나타내지 않을 수 있습니다. 그리고 가장 중요한 것은 범위를 제한하기 위해 도입 한 코드 f
는 의도적이지 않고 의도적으로 보이지 않아야합니다. 법정에 들어간 적이 있다면 의도적으로 또는 실수로 버그를 도입했는지에 대한 합리적인 의심이 있어야합니다.
심사
저와 제가 채용 한 다른 두 사람이 출품작을 심사 할 것입니다 (심판을 원하시면 저에게 이메일을 보내십시오). 우승작에 대해 200 개의 평판 현상금을 제공하고 있습니다. 제출물은 5 월 1 일까지 업로드해야합니다.
심사는 다음 기준을 고려합니다.
- 않는
f
사양을 준수 즉은 16 ^ 2 ^ 8 내지 2 가능한 출력을 생성한다. 이러한 제한이 있다고 생각하지 않지만 범위를 벗어난 경우 포인트를 차감합니다. - 의도하지 않은 실수로 인한 버그일까요?
- 출력이
f
무작위로 보입니까? - 구현 시간이 짧을수록
f
좋습니다. - 구현이 명확
f
할수록 좋습니다.
노트
코드를 구현하기 위해 모든 언어를 사용할 수 있습니다. 눈에 잘 띄는 버그를 숨기려고하므로 난독 화 된 코드는 권장되지 않습니다.
이전 Underhanded C 컨테스트 수상자 중 일부를 살펴보고 좋은 제출 방법에 대해 알아보십시오.
입력 문자열은 ASCII로 인쇄 할 수 있습니다 (32 ~ 126 포함). 원하는 경우 합리적인 최대 길이를 가정 할 수 있습니다.