文章目录

  • 一、中英文混合块加密算法
    • 一、安装 numpy 包
    • 二、需求
    • 三、参考答案
  • 二、文本文件的块加密
    • 一、安装 numpy 包
    • 二、需求
  • **注意!注意!注意!**
    • 三、参考答案
    • 四、例子

一、中英文混合块加密算法

一、安装 numpy 包

方法如下:https://blog.csdn.net/weixin_45759918/article/details/124532318

二、需求

在英文块加密的基础上,完成中英文混合的块加密算法,中文字符从0x4e00开始,矩阵大小为145*145。

分析:这次的密码本需要多种形式组成,所以可以把字符先转为Unicode码的十进制形式再放入不同数组中。
密码本组成 = 中文Unicode字符 + 英文和标点Unicode字符 + 中文标点Unicode字符
145*145 = 20908 + 95 + 22
因为中文的标点符号在Unicode并不连续所以要单独列出来
其他的算法和加密英文没有区别,改改数就行。
注意:输入的字符有时有两个一样的内容(a=[‘人’,‘人’]),加密解密时设置跳过相同字符,要不然加密解密都出错。

中文标点符号的列表

chinesePunctuationList = [183, 215, 8212, 8216, 8217, 8220, 8221, 8230, 12289, 12290, 12298, 12302, 12303, 12304,12305, 65281, 65288, 65289, 65292, 65306, 65307, 65311]

可以参考这个图

三、参考答案

import numpy as np# \u4e00到\u9FAC  +  32到126的单词字符 + 22个中文标点 == 145 ** 2
def makeMatrix():# 生成32-126的数字,过会放到汉字加密中englishCharactersList = []# 装填范围到checkList中(ascii码的规定可显示字符范围)i = 32while (i != 127):englishCharactersList.append(i)i += 1# 生成汉字的随机密码本chineseCharactersList = []# 4E00到9FC2 转为十进制为 19968-40876j = 19968while (j != 40877):chineseCharactersList.append(j)j += 1# 这里是中文的标点符号,还是要加进去的要不然出错了就。一共22个chinesePunctuationList = [183, 215, 8212, 8216, 8217, 8220, 8221, 8230, 12289, 12290, 12298, 12302, 12303, 12304,12305, 65281, 65288, 65289, 65292, 65306, 65307, 65311]allList = englishCharactersList + chineseCharactersList + chinesePunctuationList# 对两个矩阵的和进行乱序 145*145=21025# data --->> 乱序后的列表data = np.random.choice(allList, size=21025, replace=False)# 创建一个145行145列的二维矩阵,填充内容为'k'# words --->> 密码本words = np.full((145, 145), 'k')# 用于遍历data中的数x = 0# 循环将data中生成随机数输入words的二维矩阵。for i in range(145):for j in range(145):# 随机的数字直接转为字符words[i, j] = chr(int(data[x]))x += 1return words# 将输入的字符分割为两两一组的二维矩阵
# 输入: text --->> 用户输入
# 输出: data --->> 分割后的用户输入字符
def segmentationText(text):# 分割为一维数组textList = list(text)if len(textList) % 2 != 0:textList.append(" ")data = []for index in range(0, len(textList), 2):data.append(textList[index:index + 2])data = np.array(data)# print(f"分割后数据为:\n{data}")return data# 加密过程
# 块加密:生成一个随机的acsii可视范围的密码本(二维矩阵),然后将明文分为两个字母一组的二维矩阵
# 设[A,B],其在二维矩阵的密码本中位置为 A(i,j),B(x,y)
# 如果其在密码本中同一列或同行,则互换内容 加密后为[C,D]其中 C(x,y),D(i,j) 等价于加密后密文为 [B,A]
# 若不在同行同列,则加密后为[C,D]其中 C(x,j),D(i,y) 等价于横坐标不变纵坐标变为对方纵坐标
# 输入: words --->> 密码本; data --->> 分割后的用户输入; text --->> 用户原输入
# 输出:cipher --->> 加密后文本
def encryption(words, data, text):# 密文cipher = []for i in range(len(data)):A = data[i, 0]B = data[i, 1]Ax, Ay, Bx, By = 0, 0, 0, 0# 如果两个字一样,确实要跳过,要不然解密加密都出问题if A == B:cipher.append(A)cipher.append(B)continue# 找到密码本中需要加密的文字的横纵坐标for x in range(145):for y in range(145):if words[x, y] == A:Ax = int(x)Ay = int(y)elif words[x, y] == B:Bx = int(x)By = int(y)# 判断同行同列,是则交换数据if Ax == Bx or Ay == By:A, B = B, Aelse:A = words[Bx, Ay]B = words[Ax, By]cipher.append(A)cipher.append(B)cipherStr = "".join(cipher)print(f"原文为:{text}")print(f"加密后文本为:{cipherStr}")return cipher# 解密,就是加密逆过程
# 同列同行交换的,换回来
# C(x,j),D(i,y)换回A(x,y),B(i,j)
# 输入:cipher  --->> 加密后文本; words --->> 密码本; text --->> 用户原输入
def decryption(cipher, words, text):# 密文转为二维矩阵cipherList = segmentationText(cipher)# 破解翻译后的明文clear = []for i in range(len(cipherList)):A = cipherList[i, 0]B = cipherList[i, 1]Ax, Ay, Bx, By = 0, 0, 0, 0# 如果两个字一样,确实要跳过,要不然解密加密都出问题if A == B:clear.append(A)clear.append(B)continue# 找到密码本中需要加密的文字的横纵坐标for x in range(145):for y in range(145):if words[x, y] == A:Ax = int(x)Ay = int(y)elif words[x, y] == B:Bx = int(x)By = int(y)# 判断同行同列,是则交换数据if Ax == Bx or Ay == By:A, B = B, Aelse:A = words[Bx, Ay]B = words[Ax, By]clear.append(A)clear.append(B)clearStr = "".join(clear)print(f"原文为:{text}")print(f"解密为:{clearStr}")text = input("请输入需要加密的字符串:")
words = makeMatrix()
data = segmentationText(text)
print(f"分割后数据为:\n{data}")
cipher = encryption(words, data, text)
decryption(cipher, words, text)

二、文本文件的块加密

一、安装 numpy 包

方法如下:https://blog.csdn.net/weixin_45759918/article/details/124532318

二、需求

增加了从文件中读取到写入文件的问题,并且要将文件名也加密,其实只是入口不一样了,别的没有变化。
在读文件时候注意把**\n**这个东西去掉,要不然保存出问题

注意!注意!注意!

需要加密的文件放在与py文件同一个文件夹下,这样可以直接写文件名,保存也会默认保存在这里。否则请使用绝对路径。

三、参考答案

import numpy as np
import os# \u4e00到\u9FAC  +  32到126的单词字符 + 22个中文标点 == 145 ** 2
def makeMatrix():# 生成32-126的数字,过会放到汉字加密中englishCharactersList = []# 装填范围到checkList中(ascii码的规定可显示字符范围)i = 32while (i != 127):englishCharactersList.append(i)i += 1# 生成汉字的随机密码本chineseCharactersList = []# 4E00到9FC2 转为十进制为 19968-40876j = 19968while (j != 40877):chineseCharactersList.append(j)j += 1# 这里是中文的标点符号,还是要加进去的要不然出错了就。一共22个chinesePunctuationList = [183, 215, 8212, 8216, 8217, 8220, 8221, 8230, 12289, 12290, 12298, 12302, 12303, 12304,12305, 65281, 65288, 65289, 65292, 65306, 65307, 65311]allList = englishCharactersList + chineseCharactersList + chinesePunctuationList# 对两个矩阵的和进行乱序 145*145=21025# data --->> 乱序后的列表data = np.random.choice(allList, size=21025, replace=False)# 创建一个145行145列的二维矩阵,填充内容为'k'# words --->> 密码本words = np.full((145, 145), 'k')# 用于遍历data中的数x = 0# 循环将data中生成随机数输入words的二维矩阵。for i in range(145):for j in range(145):# 随机的数字直接转为字符words[i, j] = chr(int(data[x]))x += 1return words# 将输入的字符分割为两两一组的二维矩阵
# 输入: text --->> 用户输入
# 输出: data --->> 分割后的用户输入字符
def segmentationText(text):# 分割为一维数组textList = list(text)if '\n' in textList:x = 0for i in range(len(textList)):if i == "\n":textList[x] == " "x += 1# 如果输入的内容拆分后不为偶数,则给其末尾加个空格。if len(textList) % 2 != 0:textList.append(" ")data = []for index in range(0, len(textList), 2):data.append(textList[index:index + 2])data = np.array(data)# print(f"分割后数据为:\n{data}")return data# 加密过程
# 块加密:生成一个随机的acsii可视范围的密码本(二维矩阵),然后将明文分为两个字母一组的二维矩阵
# 设[A,B],其在二维矩阵的密码本中位置为 A(i,j),B(x,y)
# 如果其在密码本中同一列或同行,则互换内容 加密后为[C,D]其中 C(x,y),D(i,j) 等价于加密后密文为 [B,A]
# 若不在同行同列,则加密后为[C,D]其中 C(x,j),D(i,y) 等价于横坐标不变纵坐标变为对方纵坐标
# 输入: words --->> 密码本; data --->> 分割后的用户输入; text --->> 用户原输入
# 输出:cipher --->> 加密后文本
# 加密过程
# 块加密:生成一个随机的acsii可视范围的密码本(二维矩阵),然后将明文分为两个字母一组的二维矩阵
# 设[A,B],其在二维矩阵的密码本中位置为 A(i,j),B(x,y)
# 如果其在密码本中同一列或同行,则互换内容 加密后为[C,D]其中 C(x,y),D(i,j) 等价于加密后密文为 [B,A]
# 若不在同行同列,则加密后为[C,D]其中 C(x,j),D(i,y) 等价于横坐标不变纵坐标变为对方纵坐标
# 输入: words --->> 密码本; data --->> 分割后的用户输入; text --->> 用户原输入
# 输出:cipher --->> 加密后文本
def encryption(words, data, text):# 密文cipher = []for i in range(len(data)):A = data[i, 0]B = data[i, 1]Ax, Ay, Bx, By = 0, 0, 0, 0# 如果两个字一样,确实要跳过,要不然解密加密都出问题if A == B:cipher.append(A)cipher.append(B)continue# 找到密码本中需要加密的文字的横纵坐标for x in range(145):for y in range(145):if words[x, y] == A:Ax = int(x)Ay = int(y)elif words[x, y] == B:Bx = int(x)By = int(y)# 判断同行同列,是则交换数据if Ax == Bx or Ay == By:A, B = B, Aelse:A = words[Bx, Ay]B = words[Ax, By]cipher.append(A)cipher.append(B)cipherStr = "".join(cipher)print(f"原文为:{text}")print(f"加密后文本为:{cipherStr}")return cipher# 解密,就是加密逆过程
# 同列同行交换的,换回来
# C(x,j),D(i,y)换回A(x,y),B(i,j)
# 输入:cipher  --->> 加密后文本; words --->> 密码本; text --->> 用户原输入
def decryption(cipher, words, text):# 密文转为二维矩阵cipherList = segmentationText(cipher)# 破解翻译后的明文clear = []for i in range(len(cipherList)):A = cipherList[i, 0]B = cipherList[i, 1]Ax, Ay, Bx, By = 0, 0, 0, 0# 如果两个字一样,确实要跳过,要不然解密加密都出问题if A == B:clear.append(A)clear.append(B)continue# 找到密码本中需要加密的文字的横纵坐标for x in range(145):for y in range(145):if words[x, y] == A:Ax = int(x)Ay = int(y)elif words[x, y] == B:Bx = int(x)By = int(y)# 判断同行同列,是则交换数据if Ax == Bx or Ay == By:A, B = B, Aelse:A = words[Bx, Ay]B = words[Ax, By]clear.append(A)clear.append(B)clearStr = "".join(clear)print(f"原文为:{text}")print(f"解密为:{clearStr}")# 读文件内容转字符串
# 输入:文件名
# 输出:读取的字符串
def readFile(fileName):strs = ""# 这样写读取完文件程序会自动关闭文件,不用手动关闭with open(fileName, 'r', encoding="UTF-8", newline=None) as file:strs = file.read().splitlines()st = "".join(strs)return st# 写入文件
# 输入:cipher --->> 加密后文本;fileName --->> 文件名;words --->> 密码本
def writeFile(cipher, fileName, words):# 加密后的文件名encryptionFileName = str(fileName.split(".")[0])# 加工后的文件名fileNameData = segmentationText(encryptionFileName)# 加密后的文件名fileNamecipher = encryption(words, fileNameData, encryptionFileName)# 加密和组合文件名st = "".join(fileNamecipher) + "." + fileName.split(".")[-1]# 写入文件with open(st, "w", encoding="UTF-8") as op:op.write("加密后文本为:" + "".join(cipher))op.close()# 打开加密后的文件os.system("notepad "+fileName+" && "+"notepad "+st)fileName = input("请输入需要加密的文件名:")
# 文件名
text = readFile(fileName)
# 密码本
words = makeMatrix()
# 加工后的用户输入
data = segmentationText(text)
print(f"分割后数据为:\n{data}")
# 加密文本
cipher = encryption(words, data, text)
# 解密文本
decryption(cipher, words, text)
# 文件写入
writeFile(cipher, fileName, words)

四、例子

加密前:

加密后:

【python】 中英文混合块加密算法文本文件的块加密相关推荐

  1. python中英文混合字符串对齐

    python字符串对齐可以使用字符串的 ljust() , rjust() 和 center() 方法, ljust() 字符串靠左,需要填写两个参数,第一个参数为长度,指的是字符串需要格式化输出的总 ...

  2. des加密算法python代码_python des加密算法代码(pydes模块加密)

    python加密解密模块:pyDES模块,用来提供 DES.Triple-DES 的加密算法. 专题教程: DES加密算法,DES加密解密 python des加密解密算法 例子,Python DES ...

  3. python代码块-Python中的代码块和非代码块是什么

    Python中的代码块和非代码块是什么 发布时间:2020-06-26 13:53:30 来源:亿速云 阅读:150 今天就跟大家聊聊有关Python中的代码块和非代码块是什么,可能很多人都不太了解, ...

  4. python代码块使用缩进表示-Python 为什么使用缩进来划分代码块?

    大家好,这是"Python为什么"系列节目的文字稿(文末有观看地址). 本期话题:Python 为什么使用缩进来划分代码块,而不像其它语言使用花括号 {} 或者 "end ...

  5. python - 输出列表自动对齐(支持中英文混合)

    python - 输出列表自动对齐(支持中英文混合) 直接输出列表太难看? 是这样? 还是这样? 废话不多说,直接上代码 #实现中文字符对齐的方法 def aligns(string,length=2 ...

  6. python通过什么来区分不同语句块_python经由过程什么来辨别差别的语句块?_后端开发...

    python是经由过程缩进花样来辨别差别语句块的.Python言语应用缩进示意语句块的入手下手和退出(Off-side划定规矩),增添缩进示意语句块的入手下手,而削减缩进则示意语句块的退出. Pyth ...

  7. python 关于中英文混合输出的那点事

    python里面的len 对于汉字和非汉字都视为1个字符,然而输出的时候中文占的是2个非中文的宽度,使得一些输出无法对齐. 网上有些资料说使用空格填充的时候可以使用中文的空格,也就是 chr(1228 ...

  8. PaddleOCR加载chinese_ocr_db_crnn_server/chinese_ocr_db_crnn_modile模型进行中英文混合预测(代码)实践

    1. 环境搭建 参考:<PaddleOCR加载chinese_ocr_db_crnn_server模型进行中英文混合预测(命令行)实践> 2. 代码 import paddlehub as ...

  9. CSS 框的生成:块级元素和块框

    在盒模型中,一切皆为框,即页面上的每个元素会生成一个矩形框.默认情况下,一个元素的类型,决定了该元素生成框的类型.块级元素生成块级框,行内级元素生成行内级框,没有被任何元素所包含的文本生成匿名框. 也 ...

最新文章

  1. python读取、写入、移动、复制文件(夹)以及其他关于文件(夹)的操作
  2. 人造肌肉机械臂太逼真引热议,举7kg哑铃“肌肉”清晰可见,网友:《西部世界》...
  3. 计算机主板的1117标识,电脑出现:错误1117.......截图如下,
  4. 刚刚,国家新型互联网交换中心(以及新公司)正式成立!不止于降低网间结算费用...
  5. php实现的购物车类实例,PHP实现的购物车类实例_PHP
  6. MySQL数据库数据分开存储
  7. anaconda 包区别 版本_我是如何用Anaconda来管理Python的
  8. 中国通用电阻器市场趋势报告、技术动态创新及市场预测
  9. react中对于key值的理解
  10. 基于CSS实现的尖角提示符
  11. C# List用法;已经实例测试OK,直接可用!List 增加减少元素,输出元素
  12. 完美解决SAMSUNG Mobile USB CDC Composite Device安装失败 三星手机USB驱动失败。
  13. POS系统example.launch 的位置_关于信用卡用户使用个人POS机的建议!
  14. mysql事物幻读_MySQL事务的幻读
  15. html几种美丽的分割线
  16. ssb门限_ssb单边带的产生方法
  17. 接呀呀云实时语音SDK总结
  18. 如何用PS把照片变成红/白/蓝底
  19. 基于JAVA校园快递管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  20. Antv | G2-Plot图表在vue项目中的使用

热门文章

  1. 如何使用笔记本共享wifi给移动设备并ss上网
  2. [WiFi教程] 轻松教你支持ZTE中兴客户端
  3. Scratch少儿编程案例-坦克大战-双人对战
  4. 红蓝对抗-HW红蓝队基本知识
  5. 【开发工具】Windows触摸板操作
  6. nginx指令之——tcp_nodelay
  7. 如何在百度搜索结果中屏蔽不显示某些指定垃圾网站?
  8. 40年代中期至50年代末
  9. 交友源码中即时通讯怎么工作的?
  10. 电力杆附挂轻型自承式光缆的设计要点