使用数字加密文本
Project Euler
我最近开始尝试解一些 Project Euler 的难题。发现网站上的讨论论坛有点让人沮丧(大部分讨论都关闭了,而且讨论结构很混乱),所以我决定把我的Python解法 发布在launchpad上,方便大家讨论。
不过,发布这些解法似乎有点不太道德,因为这样会让其他人不需要自己编程就能获得声誉,而这个网站是非常不鼓励这种行为的。
我的加密问题
我想加密我的答案,这样只有那些已经解出难题的人才能看到我的代码。逻辑上,密钥就是难题的答案,而这个答案总是数字。
为了防止有人通过暴力破解来获取我的答案,我想找一个加密算法,运行起来需要比较长的时间(几秒钟)。
你知道有什么这样的算法吗?我希望能找到一个Python的库,这样我可以直接把它加到代码里,而不是使用可能有兼容性问题的外部程序。
谢谢,
亚当
7 个回答
是的,几乎任何对称加密算法都可以做到这一点,比如DSA或AES。你只需要把整数当作密钥,然后把这个密钥扩展到加密算法所需的长度,最后用这个密钥来解密结果。
不过要注意,如果你把一个短密钥扩展得很长,安全性就不会很好。加密的强度主要和密钥的长度以及算法本身有关,而不是运行的时间有多长。
这个问题里似乎有一些可以在Python中使用的库的例子。
我觉得Yin Zhu说得很对,提到了这个问题的社交方面,而Whirlwind则关注了技术方面。用你喜欢的方法:
python decrypt.py --problem=123 --key=1234567
这个关键数字很容易被谷歌找到,即使没有这个,快速尝试一百万个关键字(假设每个关键字平均有5位数字,这样的关键字长度不到20位)也是相当快的。如果我想得更聪明一点,我可以利用一些常见的文本假设(比如import
和for
),这样就能大大减少我需要搜索的范围。
考虑到这些麻烦,你可能最好还是使用一些非常复杂的方法,比如:
>>> print codecs.getencoder('rot_13')('import codecs')[0]
vzcbeg pbqrpf
如果你想解决Project Euler的第123个问题,那你得逼我说出来……
听起来人们需要自己写一个解密工具,或者使用现成的工具,或者用现成的组件来解密你的帖子。
PBKDF2是一种标准化的算法,用于根据密码生成密钥,这个算法在PKCS #5中定义。简单来说,你可以调整“迭代次数”这个参数,让从密码(也就是解决欧拉问题的答案)生成密钥的过程需要几秒钟。然后,这个密钥可以用来进行任何常见的对称加密算法,比如AES-128。
这个方法的好处是大多数加密库都已经支持PBKDF2。实际上,你可能会发现一些邮件客户端支持基于密码的S/MIME消息加密。这样你就可以直接发送S/MIME邮件,别人可以用邮件客户端来阅读。不过不幸的是,我的邮件客户端(Thunderbird)只支持公钥加密。