1. 程式人生 > >Python3 學習加解密系列 2 - 關於字串的那些事(不完整)

Python3 學習加解密系列 2 - 關於字串的那些事(不完整)

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'])

在這裡插入圖片描述