当前位置 主页 > 网站技术 > 代码类 >

    利用Python产生加密表和解密表的实现方法

    栏目:代码类 时间:2019-11-14 15:03

    序言:

    这是我第一次写博客,有不足之处,希望大家指出,谢谢!

    这次的题目一共有三个难度,分别是简单,中等偏下,中等。对于一些刚刚入门的小伙伴来说,比较友好。废话不多说,直接进入正题。

    正文:

    简单难度:

    【题目要求】:
    实现以《三国演义》为密码本,对输入的中文文本进行加密和解密。至于加密方式,最简单的从0开始,一直往后,有多个字,就最多到多少。

    【分析】:

    1.知识背景:需要用到文件的读写操作,以及字典和集合的相关知识。 

     2思路:现将文件读取进来,然后对文字进行依次编码,存入字典中.

    【代码】:

    #------------------------------简单难度-----------------------------------
    def Load_file_easy(path):
      #[注]返回值是一个set,不可进行数字索引
      file = open(path,'r',encoding='utf8')
      Str = file.read()
      Str = set(Str)
      file.close()
      return Str
    def Encode_easy(Lstr):
      Sstr = list(set(Lstr))
      Encode_Dict = {}
      for i in range(len(Lstr)):
        Encode_Dict[Sstr[i]] = i
      return Encode_Dict
    def Decode_easy(Encode_dict):
      List1 = Encode_dict.keys()
      List2 = Encode_dict.values()
      Decode_Dict = dict(list(zip(List2,List1)))
      return Decode_Dict
     
    path = 'SanGuo.txt'
    Str = list(Load_file_easy(path))
    Encode_dict = Encode_easy(Str)
    Decode_dict = Decode_easy(Encode_dict)
    #写入同级目录下的文件中,如果不存在文件,则会新创建
    #(博主的运行环境是:Ubuntu,win系统的小伙伴可能会在文件末尾加上.txt 啥的,略略略)
    with open('easy_degree_Encode_dict','w') as file:
      file.write(str(Encode_dict))
    with open('easy_degree_Decode_dict','w') as file:
      file.write(str(Decode_dict))
    

    中等偏下难度:

    【题目要求】:

    对《三国演义》的电子文档进行页的划分,以400个字为1页,每页20行20列,那么建立每个字对应的八位密码表示,其中前1~4位为页码,5、6位为行号,7、8位为这一行的第几列。例如:实:24131209,表示字“实”出现在第2413页的12行的09列。   利用此方法对中文文本进行加密和解密。

    【分析】

    和简单难度相比,就是加密的方式产生了不同,所以简单难度的框架可以保留。 
    加密方式:首先要知道这个电子文档有多少页,可以len(Str)//400,就得到了多少页(我觉得多一页少一页没啥影响就没有+1了),然后就是要对每一个字能正确的得到它的行号和列号,具体方法见代码。

    【代码】:

    def Load_file_middle(path):
      with open(path,'r',encoding='utf8') as file:
        Str = file.read()
      return Str
     
    def Encode(Str):
      Encode_dict = {}
      #得到页数
      for i in range(len(Str)//400):
        page = i + 1
        temp = Str[(i*400):(400*(i+1))]
        page_str = str(page)
        page_str = page_str.zfill(4)   
        #得到行号row和列号col
        for j in range(400):
          col = str(j)
          col = col.zfill(2)
        #这里稍微说一下:比如02是第三列,12是第13列,112是第13列,看看规律就可以了
          if int(col[-2])%2 ==0:
            col = int(col[-1]) + 1
          else:
            col = int(col[-1]) + 11
          row = str(j//20 +1)
          row = row.zfill(2)
          col = (str(col)).zfill(2)
          #print(page_str,row,col)
          Encode_dict[temp[j]] = page_str+row+str(col)
      return Encode_dict