費納姆密碼-二進位制密碼

_Bonjour發表於2017-10-17

步驟:

  • 明文根據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

相關文章