Python3 学习加解密系列 2 - 关于字符串的那些事(不完整)

版权声明:转载 请说明 https://blog.csdn.net/qq_38063791/article/details/82877953

1.str 和 hex 互转:

转为 hex
message = 'nice shooting'
test    = ''.join([ hex(ord(num)).replace('0x','') for num in message ]

转为txt
message = hex
test    =''.join([chr(int(message[num:num+2],base=16)) for num in range(0,len(message),2)])

2.利用规则替换字符串

message = 'a1aa2aaa3aaaa4a5a6aa7aaa891asdxzczxzzzzzzz'
trantab = str.maketrans('a123456',' ' *7 )   #这里的替换长度需要一致
message = message.translate(trantab)

在这里插入图片描述

3. 栅栏密码:

        message = 'abc123456'
        li_test = []
        lenth = len(message)
        # 计算 栅栏
        for i in range(2, lenth):
            if lenth % i == 0:
                li_test.append(i)
        print('和'.join([str(i) for i in li_test]), '这几种栅栏方式。。。。')
        # 尝试 所有的 栅栏方式
        for m in li_test:
            li_flag = []
            # 挖坑
            number = num = lenth // m
            for _ in range(num):
                li_flag.append('')
            # 定义起始开关
            switch = 0
            for __ in range(m):
                # 填坑
                for x, y in enumerate(message[switch:num]):
                    li_flag[x] += y
                # 叠加
                switch += number
                num += number
            print('[+]%d栏:' % m, ''.join(li_flag))
            li_flag.clear()

在这里插入图片描述

5.摩斯

        dict_str = {
            '.-': 'A',
            '-...': 'B',
            '-.-.': 'C',
            '-..': 'D',
            '.': 'E',
            '..-.': 'F',
            '--.': 'G',
            '....': 'H',
            '..': 'I',
            '.---': 'J',
            '-.-': 'K',
            '.-..': 'L',
            '--': 'M',
            '-.': 'N',
            '---': 'O',
            '.--.': 'P',
            '--.-': 'Q',
            '.-.': 'R',
            '...': 'S',
            '-': 'T',
            '..-': 'U',
            '...-': 'V',
            '.--': 'W',
            '-..-': 'X',
            '-.--': 'Y',
            '--..': 'Z',
            '-----': '0',
            '.----': '1',
            '..---': '2',
            '...--': '3',
            '....-': '4',
            '.....': '5',
            '-....': '6',
            '--...': '7',
            '---..': '8',
            '----.': '9',
            '.-.-.-': '.',
            '..--..': '?',
            '-.-.--': '!',
            '-.--.': '(',
            '.--.-.': '@',
            '---...': ':',
            '-...-': '=',
            '-....-': '-',
            '-.--.-': ')',
            '.-.-.': '+',
            '--..--': ',',
            '.----.': "'",
            '..--.-': '_',
            '...-..-': '$',
            '-.-.-.': ';',
            '-..-.': '/',
            '.-..-.': '"',
 
        }

        #处理字符串,视情况而定,这里传入
        message_mo_si = '.-- --- -'.split()

        message = ''

        for j in message_mo_si:
            try:
                message += dict_str[j]
            except Exception:
                message += ''

        print('[+]摩斯电码:',message)

在这里插入图片描述

#6.曼切斯特 转 二进制:

这里  我直接 从自己 写的类中 抠出来的
    def Manchester(self,status=None):
        '''

        :param status: 默认 曼切斯特,1 为 差分曼切斯特
        :return:
        '''
        message=''

        for num in [self.str1[bi:bi + 2] for bi in range(0, len(self.str1), 2)]:
            if status:
                message += '1' if num == '10' else '0'
            else:
                message += '1' if num == '01' else '0'
        print('[+]Manchester:',message)
        return message

7. 26字母的凯撒

def main(message):

    str1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    str2 = 'abcdefghijklmnopqrstuvwxyz'
    for num in range(1,27):
        data = ''
        for part_data  in message:

            #判断是否在 data中

            if part_data in str1+str2:
                if part_data.isupper():
                    index = str1.index(part_data)
                    data += str1[(index+num) % 26]
                else:
                    index = str2.index(part_data)
                    data += str2[(index + num) % 26]
            else:
                data += part_data
        print('凯撒密钥{}[+]:'.format(num),data)

if __name__ == '__main__':
    message = 'abcdefG.'
    main(message)

在这里插入图片描述

8.特殊的移位型凯撒
在这里插入图片描述

9.培根密码:

data1 = 'DCCDCCCDDDCDCCCDDCCCCCCCCCDDCDCCCCDCCCCCCDCCCDCCDCCCCDCCDDDCCDDDCCDCDD'

data2 = data1.replace('D', 'b').replace('C', 'a')

table = {'aaaaa': 'a', 'aaaab': 'b', 'aaaba': 'c', 'aaabb': 'd', 'aabaa': 'e', 'aabab': 'f', 'aabba': 'g', 'aabbb': 'h', 'abaaa': 'i', 'abaab': 'j', 'ababa': 'k', 'ababb': 'l', 'abbaa': 'm', 'abbab': 'n', 'abbba': 'o', 'abbbb': 'p', 'baaaa': 'q', 'baaab': 'r', 'baaba': 's', 'baabb': 't', 'babaa': 'u', 'babab': 'v', 'babba': 'w', 'babbb': 'x', 'bbaaa': 'y', 'bbaab': 'z'}

def peigen(data, flag=None, part=None):
    '''

    :param data: message
    :param flag: 默认 密文为 a,b
    :param part: 密文 是别的 两个字母 [C,D] C 会变成 a  D 会变成b 输出两种
    :return:
    '''
    message = ''

    if not flag:
        li = [data[tmp:tmp + 5] for tmp in range(0, len(data), 5)]
        for cipher in li:
            try:
                message += table[cipher]
            except Exception:
                pass
    else:
        data3 = data.replace('C', 'a').replace('D', 'b')
        peigen(data3)
        data4 = data.replace('C', 'b').replace('D', 'a')
        peigen(data4)
        return None

    print('密文:', message)
if __name__ == '__main__':
    peigen(data1, 1, ['D', 'C'])

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38063791/article/details/82877953