費納姆密碼-二進位制密碼
步驟:
- 明文根據key轉化為數字
- 數字和明(密)文進行XOR運算(這裡是我自己的理解 XOR運算意味著加解密方法是一致的)
- 數字按組轉化為密文
** key一般直接使用ascii二進位制和英文的對照表
看了表哥寫的程式碼很是羨慕 於是自己也想寫一個試試 按照自己的思路歷時接近一個半小時搞出來了
貼上自己的程式碼:
# coding: utf-8
## Fenham
## _Bonjour_Python3
#
Check_List_2num = {'A':'1000001','B':'1000010',
'C':'1000011','D':'1000100',
'E':'1000101','F':'1000110',
'G':'1000111','H':'1001000',
'I':'1001001','J':'1001010',
'K':'1001011','L':'1001100',
'M':'1001101','N':'1001110',
'O':'1001111','P':'1010000',
'Q':'1010001','R':'1010010',
'S':'1010011','T':'1010100',
'U':'1010101','V':'1010110',
'W':'1010111','X':'1011000',
'Y':'1011001','Z':'1011010'}
## key value對調
Check_List_2char = {value:key for key,value in Check_List_2num.items()}
## 轉換
def change2num(text):
finish = []
for i in text:
finish.append(Check_List_2num[i])
return finish
## 分組處理字元
def change2list(text):
num = 0
str = []
while True:
str.append(text[num:num+7])
num += 7
if(num > len(text) - 7):
break
return str
## XOR運算
def XOR(text,key):
finish = ''
for i in range(0,len(text)):
if text[i] == key[i]:
finish += '0'
else:
finish += '1'
return finish
## 加解密
# 讀文字檔案
input = open('in.txt')
try:
text = input.read()
finally:
input.close()
file = open('key.txt')
try:
key = file.read()
finally:
file.close()
##轉換key
key = change2num(key)
key = ''.join(key)
## 運算
finish = XOR(text,key)
## 轉換字母
finish = change2list(finish)
str = ''
for i in finish:
str += Check_List_2char[i]
print(str)
學到了幾個小知識點 總結一下:
- Python讀寫檔案
使用open開啟檔案後一定要記得呼叫檔案物件的close()方法。比如可以用try/finally語句來確保最後能關閉檔案。
file_object = open('thefile.txt')
try:
all_the_text = file_object.read( )
finally:
file_object.close( )
注:不能把open語句放在try塊裡,因為當開啟檔案出現異常時,檔案物件file_object無法執行close()方法
** 讀二進位制檔案
input = open('data', 'rb')
- key value對調
dict通過value找key
dict只能通過key找value 要是想通過value找key(在value不重複的前提下)一是可以通過遍歷 二是把整個字典反過來生成一個新的dict(或取代原來的)
實現程式碼:
Check_List_2char = {value:key for key,value in Check_List_2num.items()}
- 對字串進行分組處理:
def change2list(text):
num = 0
str = []
while True:
str.append(text[num:num+7])
num += 7
if(num > len(text) - 7): ##注意“-7”
break
return str
相關文章
- 關於二進位制世界的祕密
- ASCII碼是幾位二進位制碼?ASCII
- 密碼體制密碼
- 二進位制反碼求和
- 理解二進位制原碼、反碼、補碼
- 二進位制的原碼、反碼、補碼
- js二進位制和十進位制轉換程式碼JS
- 二進位制原碼、反碼、補碼詳解
- 密碼體制分類密碼
- 古典密碼的演化 (一)— 密碼學複習(二)密碼學
- 古典密碼的演化 (二)— 密碼學複習(三)密碼學
- 簡單二進位制編碼(SBE)
- 密碼破解速度全面披露:千萬別用6位密碼(轉)密碼
- 十進位制轉換為十六進位制和二進位制程式碼例項
- 希爾密碼(hill密碼)密碼
- 用Abp實現找回密碼和密碼強制過期策略密碼
- 支付6位密碼樣式密碼
- 【Redis】原始碼編譯二進位制包Redis原始碼編譯
- 密碼安全:密碼設定要求,密碼爆破辦法,密碼歸類使用,密碼處置方案密碼
- 計算機二進位制中的原碼,反碼,補碼計算機
- js將數字轉換為二進位制、十六進位制或者八進位制程式碼JS
- 二進位制與二進位制運算
- 自定義支付密碼輸入view、密碼鍵盤並自動檢測6位密碼輸入完全密碼View
- mysql學習之-密碼管理(預設密碼,修改密碼,解決忘記密碼)MySql密碼
- 進位制詳解:二進位制、八進位制和十六進位制
- 序列密碼與分組密碼密碼
- U盾密碼密碼重置方法密碼
- 隱藏密碼?顯示密碼?密碼
- 應用密碼學——古典密碼密碼學
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- profile進行密碼設定密碼
- 密碼密碼
- win10進入安全模式需要密碼初始密碼是什麼Win10模式密碼
- (二進位制)
- 二進位制
- 【密碼】Oracle使用者密碼系列密碼Oracle
- mysql 忘記密碼,mysql修改密碼MySql密碼
- ubuntu root預設密碼(初始密碼)Ubuntu密碼