0x00 简介
ROT13过去用在1980年代早期的net.jokes新闻群组。它被用来隐藏某些可能侮辱到特定读者的笑话、隐晦某个谜题的答案或八卦性的内容。之所以选一次13个字母的位移而不是其他值(例如原本凯撒加密里的3字母位移)乃因13位这个值刚刚好加密解密都是一样,故只要一行命令就可以简洁的满足两者需要。ROT13一般是新闻阅读软体内建支援的功能。Email位址有时也以ROT13编码以躲过较不复杂的垃圾邮件机器人耳目。
0x01 加密方法
套用ROT13到一段文字上仅仅只需要检查字元字母顺序并取代它在13位之后
的对应字母,有需要超过时则重新绕回26英文字母开头即可。A换成N、B换成O、依此类推到M换成Z,然后序列反转:N换成A、O换成B、最后Z换成M。只有这些出现在英文字母里头的字元受影响;数字、符号、空白字元以及所有其他字元都不变。因为只有在英文字母表里头只有26个,并且26=2×13,ROT13函数是它自己的逆反:
对任何字元x:ROT13(ROT13(x))=ROT26(x)=x。
换句话说,两个连续的ROT13应用函式会回复原始文字;在密码学上,这叫做对等加密。
0x02 ROT5/13/18/47 区别
ROT5:只对数字进行编码,用当前数字往前数的第5个数字替换当前数字,例如当前为0,编码后变成5,当前为1,编码后变成6,以此类推顺序循环。
ROT13:只对字母进行编码,用当前字母往前数的第13个字母替换当前字母,例如当前为A,编码后变成N,当前为B,编码后变成O,以此类推顺序循环。
ROT18:这是一个异类,本来没有,它是将ROT5和ROT13组合在一起,为了好称呼,将其命名为ROT18。
ROT47:对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符,例如当前为小写字母z,编码后变成大写字母K,当前为数字0,编码后变成符号_。用于ROT47编码的字符其ASCII值范围是33-126.
0x03代码
#! python3
# -*- coding: utf-8 -*-
# @Time : 2017/8/26 下午12:12
# @Author : BlingBling
# @File : ROT3.py
# @Software: PyCharm Community Edition
import string
class ROT():
def __init__(self, strs):
self.strs = strs
#两次encode即还原 rot13只加密字母
def rot13_encode(self):
start_a = ord('a')
start_A = ord('A')
encode_str = ""
for key in self.strs:
if not key.isalpha():
encode_str += key
continue
if key.islower():
start = start_a
if key.isupper():
start = start_A
#alpha表,除26求余
encode_letter = (ord(key) - start + 13) % 26 + start
encode_str += chr(encode_letter)
print("rot13:" + encode_str)
return encode_str
#rot5只加密数字
def rot5_encode(self):
encode_str = ""
for key in self.strs:
if not key.isdigit():
encode_str += key
else:
digit = (int(key) + 5) % 10
encode_digit = '%d' %digit
encode_str += encode_digit
print("rot5:" + encode_str)
return encode_str
#rot18 = rot13 + rot5
def rot18_encode(self):
self.strs = self.rot5_encode()
encode_str = self.rot13_encode()
print("rot18:" + encode_str)
return encode_str
#rot47 对数字、字母、常用符号进行编码,按照它们的ASCII值进行位置替换,用当前字符ASCII值往前数的第47位对应字符替换当前字符
def rot47_encode(self):
encode_str = ""
for key in self.strs:
tmp = ord(key) + 47
if tmp > 126:
tmp = tmp - 126 + 32
encode_str += chr(tmp)
print("rot47:" + encode_str)
return encode_str
if __name__ == '__main__':
str = input("please input string to decode:\n")
rot = ROT(str)
rot.rot13_encode()