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

序言:

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

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

正文:

简单难度:

【题目要求】:
实现以《三国演义》为密码本,对输入的中文文本进行加密和解密。至于加密方式,最简单的从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
def Decode(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_middle(path))
Encode_dict = Encode(Str)
Decode_dict = Decode(Encode_dict)
with open('middle_low_degree_Encode_dict','w') as file:
  file.write(str(Encode_dict))
with open('middle_low_degree_Decode_dict','w') as file:
  file.write(str(Decode_dict))

中等难度(只针对英文!)

【题目要求】:现监听到敌方加密后的密文100篇,但是不知道敌方的加密表,但是知道该密码表是由用一个英文字母代替另一个英文字母的方式实现的,现请尝试破译该密码。(注意:只针对英文)

【分析】:

知识背景:需要爬虫的相关知识
思路:找到每一个字符使用的频率,明文和密文中频率出现相近的字符就可以确定为同一个字符,剩下的就和前面的一样了
【代码】:

先把爬虫的代码贴出来:

文件名:Crawler.py

import re
import requests

def Crawler(url):
  #url2 = 'https://www.diyifanwen.com/yanjianggao/yingyuyanjianggao/'
  response = requests.get(url).content.decode('gbk','ignore')
  html = response
  #正则表达式
  #example_for_2 = re.compile(r'<li><a.*?target="_blank".*?href="(.*?)title=(.*?)>.*?</a></li>')
  example_for_1 = re.compile(r'<i class="iTit">\s*<a href="(.*?)" rel="external nofollow" target="_blank">.*?</a>')

  resultHref =re.findall(example_for_1,html)
  resultHref = list(resultHref)
  Fil = []
  for each_url in resultHref:
    each_url = 'https:' + str(each_url)

    #构建正则
    exam = re.compile(r'<div class="mainText">\s*(.*?)\s*<!--精彩推荐-->')
    response2 = requests.get(each_url).content.decode('gbk','ignore')

    html2 = response2
    result_eassy = re.findall(exam,html2)
    Fil.append(result_eassy)

  return str(Fil)
def WriteIntoFile(Fil,path):
  #写入文件
  with open(path,'a') as file:
    for i in range(len(Fil)//200):
      file.write(Fil[200*i:200*(i+1)])
      file.write('\r\n')
    if file is not None:
      print("success")
def Deleter_Chiness(str):
  #删掉汉字、符号等
  result1 = re.sub('[<p> </p> u3000]','',str)
  result = ''.join(re.findall(r'[A-Za-z]', result1))
  return result

主程序:

import Crawler

#产生一个密文加密表
def Creat_cipher_dict(num=5):
  cipher_dict = {}
  chri = [chr(i) for i in range(97,123)]

  for i in range(26-num):
    cipher_dict[chri[i]] = chr(ord(chri[i])+num)
  for i in range(num):
    cipher_dict[chri[26-num+i]] = chr(ord(chri[i]))
  return cipher_dict
def Get_Frequency(Str):
  Frequency = [0] * 26
  cnt = 0
  chri = [chr(i) for i in range(97, 123)]
  Frequency_dict = {}
  for i in range(len(Str)):
    Ascii = ord(Str[i]) - 97
    # 排除一些还存在的异常字符
    if Ascii >= 0 and Ascii <= 25:
      Frequency[Ascii] += 1
      cnt += 1
      Frequency_dict[chr(Ascii+97)] = Frequency[Ascii]
  for key in Frequency_dict.keys():
    #Frequency[i] = Frequency[i] / cnt
    Frequency_dict[key] = Frequency_dict[key]/cnt
  Frequency_dict = sorted(Frequency_dict.items(),key = lambda x:x[1],reverse=True)
  return dict(Frequency_dict)
def Decode(cipher,org):
  Frequency_for_cipher = Get_Frequency(cipher)
  Frequency_for_org = Get_Frequency(org)
  #print(Frequency_for_org)
  #print(Frequency_for_cipher)
  Decode_dict = {}
  Frequency = list(Frequency_for_org.keys())
  i = 0
  for key in list(Frequency_for_cipher.keys()):
    Decode_dict[key] = Frequency[i]
    i +=1
  return Decode_dict
def main():
  #爬取文章作为提取明文概率的计算文本
  for i in range(1,15):
    url = 'https://edu.pcbaby.com.cn/resource/yjg/yy/'+'index_'+str(i)+'.html'
    try:
      Fil = Crawler.Crawler(url)
      eassy = Crawler.Deleter_Chiness(Fil)
      path = 'eassy_org'
      Crawler.WriteIntoFile(path,eassy)
    except :
      print("爬虫发生意外!")

  path = 'eassy_org'
  with open(path) as file:
    org = str(file.read().splitlines())
    org = org.lower()
   #创建一个密文
  cipher_dict = Creat_cipher_dict(5)
  print(cipher_dict)
  #这里密文我已经爬取好了,存在本地了,爬取过程同上面大同小异
  with open('eassy_cipher','r') as file:
    Fil2 = str(file.read().splitlines())
    Fil2 = Fil2.lower()
  cipher = []
  for i in range(len(Fil2)):
    if ord(Fil2[i])>=97 and ord(Fil2[i])<=123:
      cipher.append(cipher_dict[Fil2[i]])
  #至此 ,密文产生好了,每一个字母的概率也计算好了,可以说,工作完成了一大半了
  Decode_dict = Decode(cipher,org)
  print(Decode_dict)
if __name__ == '__main__':
  main()

最后还是将结果贴出来给大家看一下:

上面一个字典是我创建出来的加密表,后一个是根据每个字符出现的概率反解出来的加密表,可见二者的相似程度具有很大的相似度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python实现对字符串的加密解密方法示例

    本文实例讲述了Python实现对字符串的加密解密方法.分享给大家供大家参考,具体如下: 需求是是要将密码存在数据库里,所以要加密解密是可逆的,在数据库里不要有特殊字符,防止数据库备份和恢复中出错. 安装PyCrypto,可以用AES和DES.我使用DES加解密.加密后将密文转为16进制,在入库.测试代码如下. ; html-script: false ]#!/bin/python #-*- coding:utf-8 -*- # Filename: # Revision: # Date: 2013

  • Python基于pycrypto实现的AES加密和解密算法示例

    本文实例讲述了Python基于pycrypto实现的AES加密和解密算法.分享给大家供大家参考,具体如下: 一 代码 # -*- coding: UTF-8 -*- import string import random from Crypto.Cipher import AES def keyGenerater(length): '''''生成指定长度的秘钥''' if length not in (16, 24, 32): return None x = string.ascii_lette

  • DES加密解密算法之python实现版(图文并茂)

    一.DSE算法背景介绍 1. DES的采用 1979年,美国银行协会批准使用 1980年,美国国家标准局(ANSI)赞同DES作为私人使用的标准,称之为DEA(ANSI X.392) 1983年,国际化标准组织ISO赞同DES作为国际标准,称之为DEA-1 该标准规定每五年审查一次,计划十年后采用新标准 最近的一次评估是在1994年1月,已决定1998年12月以后,DES将不再作为联邦加密标准. 2.DES算法特点 1) 分组加密算法: 以64位为分组.64位一组的明文从算法一端输入,64位密文

  • python中base64加密解密方法实例分析

    本文实例讲述了python中base64加密解密方法.分享给大家供大家参考.具体分析如下: 一.base64 Base64是一种基于64个可打印字符来表示二进制数据的表示方法.由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符.三个字节有24个比特,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示.它可用来作为电子邮件的传输编码.在Base64中的可打印字符包括字母A-Z.a-z.数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中而不同.编码后的

  • python有证书的加密解密实现方法

    本文实例讲述了python有证书的加密解密实现方法.分享给大家供大家参考.具体实现方法如下: 最近在做python的加解密工作,同时加完密的串能在php上能解出来,网上也找了一些靠谱的资料,刚好也有时间我就总结了一下python在加密与解密这块的代码,今后可能还能用的上.相对于php而言python这块加解密组件较多的,分别是: python-crypto - 这个组件是基本组件,使用的函式相对比较复杂. ezPyCrypto - 相对简单,但他作出来的公私钥无法与其他程序相兼容     SSL

  • Python基于DES算法加密解密实例

    本文实例讲述了Python基于DES算法加密解密实现方法.分享给大家供大家参考.具体实现方法如下: #coding=utf-8 from functools import partial import base64 class DES(object): """ DES加密算法 interface: input_key(s, base=10), encode(s), decode(s) """ __ip = [ 58,50,42,34,26,18,

  • python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优化 1. desstruct.py DES加密中要使用的结构体 ip= (58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32,

  • 使用Python进行AES加密和解密的示例代码

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.---百度百科 本科的时候弄过DES

  • python实现RSA加密(解密)算法

    RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要其密钥的长度足够长,用RSA加密的信息实际上是不能被解破的.但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战. RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.

  • 利用python在excel里面直接使用sql函数的方法

    我们一般在Excel里面是使用数据连接属性里面写sql语句,或者vba里面利用ado组件执行sql语句. 新版的Excel里面带上了Power query的功能也可以使用Odbc.DataSource()和Odbc.Query()函数写sql语句. 今天讲一下利用Python直接在excel里面使用xlwings addin 里的一个名为sql的函数. 首先我们需要在python里面安装好xlwings模块. 执行pip/conda install xlwings命令 即可完成安装. 然后继续在

  • 利用Python实现在同一网络中的本地文件共享方法

    本文利用Python3启动简单的HTTP服务器,以实现在同一网络中共享本地文件. 启动HTTP服务器 打开终端,转入目标文件所在文件夹,键入以下命令: $ cd /Users/zero/Documents/localFiles # python -m http.server <port number> $ sudo python3 -m http.server 8092 Serving HTTP on 0.0.0.0 port 8092 (http://0.0.0.0:8092/) ... 生

  • 利用python GDAL库读写geotiff格式的遥感影像方法

    如下所示: from osgeo import gdal import numpy as np def read_tiff(inpath): ds=gdal.Open(inpath) row=ds.RasterXSize col=ds.RasterYSize band=ds.RasterCount geoTransform=ds.GetTransform() proj=ds.GetTransform() data=np.zeros([row,col,band]) for i in range(b

  • 利用Python将数值型特征进行离散化操作的方法

    如下所示: data = np.random.randn(20) factor = pd.cut(data,4) pd.get_dummies(factor) 0 0 0 0 1 1 1 0 0 0 2 0 0 0 1 3 0 0 1 0 4 1 0 0 0 5 0 1 0 0 6 0 1 0 0 7 0 1 0 0 8 0 0 1 0 9 0 1 0 0 10 0 0 0 1 11 0 1 0 0 12 0 1 0 0 13 0 0 1 0 14 0 0 1 0 15 0 1 0 0 16 0

  • Python实现加密的RAR文件解压的方法(密码已知)

    博主之前在网上找了很多资料,发现rarfile库不能直接调用,需要安装unrar模块,下面将详细介绍整个实现流程. 第一步:安装unrar模块,直接pip install unrar可能会找不到库,需要下载unrar library,也就是UnRAR.dll,下载地址为:http://www.rarlab.com/rar/UnRARDLL.exe: 第二步:将unrar安装路径添加到系统环境变量,64位操作系统的路径为C:\Program Files (x86)\UnrarDLL\x64,然后还

  • 利用python打印出菱形、三角形以及矩形的方法实例

    前言 本文主要给大家介绍了关于利用python打印出菱形.三角形以及矩形的相关内容,分享出来供大家参考学习,话不多说,来一起看看详细的介绍: 实例代码 #coding:utf-8 rows = int(raw_input('输入列数: ')) i = j = k = 1 #声明变量,i用于控制外层循环(图形行数),j用于控制空格的个数,k用于控制*的个数 #等腰直角三角形1 print "等腰直角三角形1" for i in range(0, rows): for k in range

  • 利用python实现对web服务器的目录探测的方法

    一.python Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. python 是一门简单易学的语言,并且功能强大也很灵活,在渗透测试中的应用广泛,让我们一起打造属于自己的渗透测试工具 二.web服务器的目录探测脚本打造 1.在渗透时如果能发现web服务器中的webshell,渗透是不是就可以变的简单一点尼 通常情况下御剑深受大家的喜爱,但是今天在测试的时候webshell不知道为什么御剑扫描不到 仔细查看是webshell有防爬功能,是检测User-Agent头,如果没有

  • 利用Python将list列表写入文件并读取的方法汇总

    目录 1.writelines()直接写入 2.str转化为字符串写入 3.for循环写入 4.使用.join函数修改列表 读取数据 附:还有写csv文件和excel文件的方式 总结 1.writelines()直接写入 l=["A","B","C","D"] f=open("k.txt","w") f.writelines(l) f.close() 该方法写入直接写入列表元素 2.st

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

    序言: 这是我第一次写博客,有不足之处,希望大家指出,谢谢! 这次的题目一共有三个难度,分别是简单,中等偏下,中等.对于一些刚刚入门的小伙伴来说,比较友好.废话不多说,直接进入正题. 正文: 简单难度: [题目要求]: 实现以<三国演义>为密码本,对输入的中文文本进行加密和解密.至于加密方式,最简单的从0开始,一直往后,有多个字,就最多到多少. [分析]: 1.知识背景:需要用到文件的读写操作,以及字典和集合的相关知识. 2思路:现将文件读取进来,然后对文字进行依次编码,存入字典中. [代码]

  • 利用python批量给云主机配置安全组的方法教程

    前言 这几年对运维人员来说最大的变化可能就是公有云的出现了,我相信可能很多小伙伴公司业务就跑在公有云上,  因为公司业务关系,我个人接触公有云非常的早,大概在12年左右就是开始使用亚马逊云,后来逐渐接触到国内的阿里,腾讯云等,随着公司业务往国内发展,这几年我们也使用了很多国内的公有云厂商,所以在云运维方面也积累了一些经验,从传统的物理机到公有云运维,我个人认为最大的问题就是你能不能用公有云的思路去思考去实现一个安全稳定.可伸缩和经济的业务构架,云运维是有别与传统运维的,比如说了解公有云的都知道安

随机推荐