ROT5/13/18/47 密码

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()

你可能感兴趣的:(python,CTF,密码学)