费纳姆密码-二进制密码
程序员文章站
2022-03-12 20:52:51
...
步骤:
- 明文根据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
上一篇: CentOS7修改主机名