Python3 學習加解密系列 2 - 關於字串的那些事(不完整)
阿新 • • 發佈:2018-11-16
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'])