密码学中的变换加密技术

替换加密技术是将一个明文字符换成一个密文字母。变换加密则与替换加密技术不同,它不是简单的把一个字母转换成另一个字母,而是对明文字母进行某种置换。

一、栅栏加密技术

栅栏加密技术是将明文消息写成对角线序列,然后一行一行地产生密文。其简单算法有以下两个步骤:
(1)将明文消息写成对角线序列
(2)将第一步写出的明文读入行序列
下面用一个简单示例来说明栅栏加密技术,假设明文消息为“My name is ZhInen”,将明文消息转换成密文消息的关系图如下:
在这里插入图片描述
正如上图所示,明文消息“My name is ZhInen”,通过栅栏加密技术变成“MnmiZIeyaeshnn”。其算法的加密和解密的python代码如下:

#栅栏加密技术
import math
#要加密或者解密的字符串
print('输入明文消息或者密文消息:')
message=input()
#print(message)
#程序是加密(encrypt)还是解密(decrypt)
#mode='encrypt'
mode='decrypt'
#保存可能要加密的字符
symbols='ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
#计数,判断在加密形式下,字母的位置
i=1
#存储消息的加密或者解密形式
translated=''
translated1=''
translated2=''
#获取字符串长度
length=len(message)
halflen=math.ceil(length/2)
#注意只能加解密symbols字符串中的符号
#如果进行加密操作
if mode=='encrypt':
    for symbol in message:
        if symbol in symbols:
            if i%2==1:
                translated1=translated1+symbol
            elif i%2==0:
                translated2=translated2+symbol
            i=i+1
#如果进行解密操作
elif mode=='decrypt':
    for sum in range(0,halflen):
        translated=translated+message[sum]+message[halflen+sum]
#输出translated的字符串
if mode=='encrypt':
    print(translated1+translated2)
elif mode=='decrypt':
    print(translated)

运行的结果图如下:
加密:
在这里插入图片描述
解密:
在这里插入图片描述

一、简单分栏式变换加密技术

简单分栏式变换加密技术只是将明文排列成矩阵中的行序列,按随机顺序读取。其机制如下:
(1)将明文一行一行地写入预定长度的矩形中;
(2)一列一列读消息,但不一定按1,2,3列顺序,也可以,如:2,3,1;
(3)得到的消息就是密文消息。
下面用一个示例来说明简单分栏式变换加密技术。假设明文消息为“My name is ZhInen”,以下步骤显示了如何用简单分栏式变换加密技术将其变成密文:
(1)假设矩形为5列,则可以将明文一行一行地写入到矩形中:

第一列第二列第三列第四列第五列
Mynam
eisZh
Inen

(2)下面指定随机列顺序,如:5,2,1,3,4,然后按着这个顺序一列一列进行读取;
(3)得到密文消息“mhyinMeInseaZn”
简单分栏式变换加密技术的Python代码可以表示如下:

#简单分栏式变换加密技术
import numpy as np
import math
#假设矩形的列数
column=5
#要加密的明文消息
print('请输入要加密的明文消息:')
message=input()
#去除明文消息中所有的空格
message=message.replace(' ','')
#print(message)
#获取字符串长度
length=len(message)
#print(length)
#确定矩形的行数
raw=math.ceil(length/column)
#print(raw)
#创建字符矩阵
array=np.zeros((raw,column))
array=array.astype(np.str)
#将密文消息存储到数组中
mess=0
for i in range(0,raw):
    for j in range(0,column):
        if mess<length:
            array[i][j]=message[mess]
            mess=mess+1
#print(array)
#可能加密的字母
symbols='ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
#确定列顺序
colorder=[5,2,1,3,4]
#存储加密后的形式
translated=''
#进行加密操作
for colord in colorder:
    #进行列读取
    for sum in range(0,raw):
        #判断是否是加密字符
        if array[sum][colord-1] in symbols:
            translated=translated+array[sum][colord-1]
#显示密文信息
print(translated)

其示例的输出结果为:
在这里插入图片描述

三、多轮简单分栏式变换加密技术

多轮简单分栏式变换加密技术使得密文比基本简单分栏式加密技术得到的密文更加复杂。如下显示了多伦简单分栏式变换加密技术的简单算法:
(1)将明文消息一行一行地写入预定长度的矩形中;
(2)一列一列读消息,但是不一定按1,2,3列的顺序,也可以按随机顺序;
(3)得到的消息就是密文消息,这是第一轮;
(4)将1~3步重复多次。
为了使密码分析员更难破译,多轮简单分栏式变换加密技术就是将简单分栏式变换加密技术中的变换进行多次,从而增加复杂性。其python代码如下(假设加密5次):

#多轮分栏式变换加密技术
import numpy as np
import math
#假设矩形的列数
column=5
#要加密的明文消息
print('请输入要加密的明文消息:')
message=input()
#去除明文消息中所有的空格
message=message.replace(' ','')
#print(message)
#获取字符串长度
length=len(message)
#print(length)
#确定矩形的行数
raw=math.ceil(length/column)
#print(raw)
#创建字符矩阵
array=np.zeros((raw,column))
array=array.astype(np.str)
#加密的次数
muls=5
#可能加密的字母
symbols='ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
#确定列顺序
colorder=[5,2,1,3,4]
#开始进行多次变换
for mul in range(1,muls+1):
    #存储加密后的形式
    translated=''
    #将密文消息存储到数组中
    mess=0
    for i in range(0,raw):
        for j in range(0,column):
            if mess<length:
                array[i][j]=message[mess]
                mess=mess+1
    #print(array)
    #进行加密操作
    for colord in colorder:
        #进行列读取
        for sum in range(0,raw):
            #判断是否是加密字符
            if array[sum][colord-1] in symbols:
                translated=translated+array[sum][colord-1]
    #显示密文信息
    print('第',mul,'次加密后的密文:',translated)
    message=translated

其示例测试的结果为:
在这里插入图片描述

四、Vernam加密法

Vernam加密法也称为一次性板,用随机的非重复字符集合作为输入密文。这里最重要的是,一旦使用变换的输入密文,就不在任何其他消息中使用这个输入密文(因此是一次性的)。输入密文的长度等于原消息明文的长度。如下步骤显示了Vernam加密算法:
(1)按递增顺序把每个明文字母作为一个数字,即A=0,B=1,…,Z=25;
(2)对输入的密文中每个字母进行相同的处理;
(3)将明文中的每个字母与输入密文中的对应字母相加;
(4)如果得到的和大于26,则从中将去26;
(5)将和变成相应字母,从而得到输出密文。
假设明文消息为“My name is ZhInen”,一次性板(输入密文)为:“YhjadhdhShHpld”,其python代码如下:

#Vernam加密法
#要加密的明文消息
message='My name is ZhInen'
#去除文明消息的中的空格
message=message.replace(' ','')
#一次性板(输入密文)
board='YhjadhdhShHpld'
#可能加密的明文字符
symbols1='ABCDEFGHIGKLMNOPQRSTUVWXYZ'
symbols2='abcdefghijklmnopqrstuvwxyz'
#保存密文消息
translated=''
#计数作用
sum=0
#遍历加密的明文消息
for mess in message:
    #如果加密的明文字母是大写字母
    if mess in symbols1:
        #保存明文字母和输入密文相加后的值
        flag=(ord(mess)-ord('A'))+(ord(board[sum])-ord('A'))
        #将所得的值变成字母
        translated=translated+chr(flag%26+ord('A'))
    #如果加密的明文字母是小写字母
    elif mess in symbols2:
        #保存明文字母和输入密文相加后的值
        flag=(ord(mess)-ord('a'))+(ord(board[sum])-ord('a'))
        #将所得的值变成字母
        translated=translated+chr(flag%26+ord('a'))
    sum=sum+1
#输出得到的密文消息
print(translated)

其示例的结果如下:
在这里插入图片描述

五、书加密法

书加密法也称为运动密钥加密法,思路与Vernam加密法相似,产生密文时,用书中的某段文本,作为一次性板。这样书中的字符成为一次性板,像一次性板中一样,与输入明文消息相加。其python代码与Vernam代码一样。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhInen丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值