ROT5/13/18/47 密码

来源:互联网 发布:知行英语综合教程下载 编辑:程序博客网 时间:2024/06/05 02:17

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 Editionimport stringclass 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_strif __name__ == '__main__':    str = input("please input string to decode:\n")    rot = ROT(str)    rot.rot13_encode()
原创粉丝点击