牛刀小试——Python 2.7下的rot13编码与解码

作者: shisaq 日期: November 14, 2016
rot13是什么?它是一种很好玩的编码技术。可以参考[wiki](https://en.wikipedia.org/wiki/ROT13)。其实我更想叫它“加密”,不过因为它太容易破解了,所以我还是自己这么叫它吧。

原理

rot13,展开说就是“rotate by 13 places”,也就是向后移动13个位置。我们都知道,英文字母一共有26个。如果你把它们想象成一个圈圈,让a和z手拉着手,此时从a往后数13个,就是n;那么从n再往后数13个,就又回到了a。也就是说,rot13可以让你对一段话中的每个英文字母都往后移动13个,从而达到编码(加密)的效果。

栗子

hello 经过rot13编码后就是 uryyb 。乍一看uryyb,这是神马玩意?你看不懂,自然就是加密了。但是有人再用rot13编码一遍,就把uryyb 变回了hello 。

实现

在StackOverflow上找到了Python内置的办法:http://stackoverflow.com/a/3270252/5769598。有了核心代码,剩下的工作就是写个app.yaml 和rot13cipher.py ,然后按照我之前那篇文章把代码上传到GAE服务器就可以了。

app.yaml 中的代码:

1
2
3
4
5
6
7
8
9
10
<code>application: udacitywebdevelopment-149320
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
 script: rot13cipher.app
</code>

rot13cipher.py 的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code>import webapp2
import cgi
import codecs

# build a simple html form
form = """
<form method="post">
<h1 style="color: green">Let's use rot13 cipher!</h1>
<textarea name="text" rows="8" cols="40">%(text)s</textarea>
<input type="submit">
</form>
"""

# build a function that make the special characters into character entities, such like "&" -- "&amp;"
def escape_html(s):
 return cgi.escape(s, quote = True)

class MainPage(webapp2.RequestHandler):
 def write_form(self, text=""):
 self.response.out.write(form % {'text': escape_html(text)})

 def get(self):
 self.write_form()

 def post(self):
 user_text = self.request.get('text')

 # 'ignore' is to ignore Chinese characters
 translated_text = codecs.encode(user_text, 'rot_13', 'ignore')

 self.write_form(translated_text)

app = webapp2.WSGIApplication([
 ('/', MainPage),
], debug=True)
</code>

其中,codecs.encode 就内置了rot13的编码技术。在测试的过程中,我发现如果输入中文的话,服务器就500错误了。于是查阅了Python文档,使用了ignore ,使得服务器将中文字符忽略掉。虽然不是最好的方法,但是基本功能还是满足了。毕竟,rot13就是针对英文的,中文本来也就没法用,哈哈。