本着“ 不熟练C竞赛”的精神,我正在发起不熟练C竞赛。该竞赛的目的是直接实现一些代码,同时在其中隐藏一个邪恶的bug。
比赛
您是在美国间谍机构的IT部门工作的秘密俄罗斯痣。您的美国老板刚刚要求您实施密码哈希算法,以用于加密秘密消息。
您的老板希望您实现以下功能:
f: String -> byte[16]
它将密码转换为16字节的数量,适合用作AES密钥。您的老板想要一个安全的功能,在这种情况下,这意味着不同的密码字符串应以压倒性的可能性生成不同的结果。例如,返回输入的md5哈希将是的简单实现f
。
当然,您在俄罗斯间谍机构中的真正上司会希望您颠覆这一过程。您的任务是实现f
使俄罗斯人可以解密使用所返回的密钥加密的所有秘密消息f
。
为此,必须实现f
以使其仅返回2 ^ 128个可能输出的一小部分。特别是,您f
必须最多返回2 ^ 16个不同的结果,以便俄罗斯人可以轻松地用蛮力搜索想要解密的每条加密消息的正确密钥。
但是请记住,间谍活动会判处死刑。为了不被发现,您的函数f
必须至少产生2 ^ 8个不同的结果,以便对的几个输出进行粗略的检查f
就不可能发现重复的结果。 最重要的是,您引入的限制范围的代码f
必须看起来是无意的,而不是故意的。 如果您曾经被拖入法庭,那么对于您是故意还是无意中引入了该错误,一定存在一些合理的疑问。
评判
我和我招募的其他两个人将对参赛作品进行评判(如果您想评判,请给我发电子邮件)。我将为获奖作品提供200点声望奖励。提交的内容必须在5月1日之前上传。
评审将考虑以下标准:
- 是否
f
坚持以规范,即,它不会产生2和2之间^ 8 ^ 16个可能的输出。不要以为这是硬性限制,但是如果您超出范围,我们会扣除分数。 - 该错误貌似是非故意错误的结果吗?
f
外观的输出是否随机?- 您实施的时间越短
f
越好。 - 您实施的
f
越清晰,效果越好。
笔记
您可以使用任何语言来实现您的代码。您正试图将错误隐藏起来,因此不建议使用混淆的代码。
您可能想看看以前的一些欠人手C比赛获胜者,以了解提交优秀作品的原因。
输入字符串将是可打印的ascii(包括32至126)。如果需要,可以假定一个合理的最大长度。