我最近开始解决一些Project Euler谜语。我发现网站上的讨论论坛有点令人沮丧(大多数讨论都是封闭的,线程很差),所以我决定publish my Python solutions on launchpad进行讨论。
问题在于,发布这些解决方案似乎是不道德的,因为它会让其他人在没有进行编程工作的情况下获得声誉,而网站则不鼓励这样做。
我想加密我的答案,以便只有那些已经解决了谜语的人才能看到我的代码。逻辑键将是谜语的答案,它始终是数字。
为了防止对我的答案进行暴力攻击,我想找到一种需要很长时间(几秒钟)才能运行的加密算法。
你知道这样的算法吗?我想要一个Python包,我可以附加到代码上,通过可能存在可移植性问题的外部程序。
谢谢,
亚当
答案 0 :(得分:4)
听起来人们必须编写自己的解密工具,或使用现成的东西,或使用现成的组件来解密你的帖子。
PBKDF2是基于密码的密钥推导的标准化算法,在PKCS#5中定义。基本上,您可以调整“迭代”参数,以便从密码(欧拉问题的答案)派生密钥需要几秒钟。然后,密钥可用于任何常见的对称加密算法,如AES-128。
这具有大多数加密库已经支持PBKDF2的优点。实际上,您可能会发现支持S / MIME消息的基于密码加密的邮件客户端。然后你可以发布一个S / MIME,人们可以用邮件客户端读取它。不幸的是,我的邮件客户端(Thunderbird)只支持公钥加密。
答案 1 :(得分:2)
我认为尹朱盯着它的社会方面和旋风技术。使用您首选的方法:
python decrypt.py --problem=123 --key=1234567
谷歌随时可以获得密钥号码,即使没有密码,也可以通过一百万个密钥(假设中间密钥长度为5位十进制数,产生少于20位密钥)非常快。如果我想要更聪明,我可以使用纯文本假设(例如import
,for
)并大大减少我的搜索空间。
对于所有麻烦,你可能最好使用一些非常复杂的东西:
>>> print codecs.getencoder('rot_13')('import codecs')[0]
vzcbeg pbqrpf
如果你想要解决Project Euler问题123的问题,你将不得不打败我......
答案 2 :(得分:1)
是的,您可以使用几乎任何对称加密算法执行此操作:例如DSA或AES;只需使用整数作为密钥,并将密钥填充到加密算法密钥的所需长度,然后使用该密钥解密答案。
请记住,如果您扩展一个短密钥,加密将不会很好。加密的强度与密钥长度和算法本身有很大关系,而不是运行所需的时间。
这个question似乎有一些与python一起使用的库的例子。
答案 3 :(得分:0)
只需使用三重DES并为每次迭代使用不同的密钥,使用该数字生成3个密钥中的每一个。用一些文字填充密钥长度,你很好。
Tripple DES旨在提高对抗蛮力的效率。
这不是世界上最安全的选择,但我会让大多数人都不知所措。
答案 4 :(得分:0)
如果您加密了答案,那么解决问题的人根本不希望看到您的答案,只要他们已经在答案页面中有足够的答案。那些没有看不到的人。那么你的工作变得没用了。
顺便说一下,有许多地方为Project Euler提供答案,例如: Haskell answers,Clojure answers,F# answers。如果有人只想要问题的答案,他/她可以简单地运行该程序。如果Python如此受欢迎,谷歌“Python Euler xx”将为您提供大量解决特定问题的博客。
答案 5 :(得分:0)
最简单的方法是使用安全散列函数(如SHA-1)散列答案,然后提供散列,以便用户可以验证他们的答案。如果你想使暴力破解变得更加困难,那么迭代哈希 - 例如,提供SHA的n个递归应用的结果,其中n是你选择的一些参数,使其难以暴力破解。
如果可能的答案数量很少,那么即使使用昂贵的哈希函数,也很难阻止某人蛮力破解。
编辑:对不起,我误解了您的原始问题。如果您想加密答案,可以使用上面生成的哈希作为答案的加密密钥,而不是发布哈希值。答案 6 :(得分:0)
如果您想要一个易于使用和分发的加密例程,我推荐Paul Rubin的p3.py。这可能是在快速的一面,因为它有多安全,但由于你似乎需要一个障碍而不是一个防围墙,所以它可能是一个很好的选择。
您还可以查看rijndael.py,它是AES的实现,并且比p3.py慢。