置换密码加密解密设计

置换密码加密解密设计

实验目的与要求

1. 帮助学生掌握置换密码的加密解密过程,能够利用所学过的编程语言,熟悉加密算法流程与编程实现加密算法。使学生掌握编程实现实际问题中的方法,提高专业技能和专业素养。

2. 要求学生掌握算法的程序实现的方法,能应用密码算法的特点,设计合适的交互界面,并能正确实现应用编程。

3. 分析算法程序的质量。

4.要求学生掌握用规范的方法书写实验报告。

实验原理与内容

置换密码加密解密过程

设明文为:4D 61 65 53 2D 4F 69 20 4E。密钥为3333333333。 求加密后的16进制密文。

解 先思考和描述算法,也就是对明文4D 61 65 53 2D 4F 69 20 4E实现置换8,1,6,3,5,7,4,9,2。通过对数组赋值实现:

m(i)={4D 61 65 53 2D 4F 69 20 4E},i=1,2,3,…,9。

k(i)={8,1,6,3,5,7,4,9,2},i=1,2,3,…,9。

c(i)=m(k(i)), i=1,2,3,…,9。

c(1),c(2),…,c(9)为密文。

密文序列为:20 4D 4F 65 2D 69 53 4E 61。

实验设备与软件环境

1. PC Windows环境

2.使用Java编程语言开发环境,或者Maple语言。或者C#开发环境开发环境。

实验过程与结果(可贴图)

置换密码只不过是简单的换位而已,这里写的是一个分组长度为7的置换密码因为所学知识有限,写的比较麻烦,这里先简单介绍一下思路:

1.因为置换密码首先要将其进行分组,这里分组长度为7,不足的位数补0,可以选取二维数组进行操作,定义二维数组,明文有多少个分组二维数组中就有多少个一维数组,其中一维的长度就是分组长度
2.定义一个一维数组key作为加密用的秘钥,一个一维数组trankey作为解密秘钥,这里其中的元素是自己写的
3.输入明文,现将其存入扩容好的新建的一维数组中但此时填充位是空字符'\0',再将其替换为'0',存入二维数组中
4.加密,用秘钥key中的顺序对明文进行加密并存入二维数组miwen中
5.解密,用解密秘钥trankey中的顺序对密文解密存入二维数组arr中
6.消去填充的0,算出填充了多少个0,然后用分组长度减去0的个数就是二维数组中最后一个一维数组中非填充位的个数,将其存入一维数组中,在用此一维数组替换最后一个一维数组,这样就消去了所有的填充的0

代码如下

#4D 61 65 53 2D 4F 69 20 4E

#8 1 6 3 5 7 4 9 2

#解密

#先输入密文 20 4D 4F 65 2D 69 53 4E 61

#幻方密文 61 4E 53 69 2D 65 4F 4D 20

def huang_jiemi():

print ( '请输入密文' )

min_wen=list(input().split()) #密文

print ( '请输入密钥' )


mi_wen=list(input().split()) #密钥

#判断是否是幻方

flag=0

if mi_wen[0]+mi_wen[4]+mi_wen[8]==15:

print( "条件1符合" )

flag=flag+1

elif mi_wen[1]+mi_wen[4]+mi_wen[7]==15:

print( "条件2符合" )

flag=flag+1

elif mi_wen[2]+mi_wen[5]+mi_wen[8]==15:

print( "条件3符合" )

flag=flag+1

elif mi_wen[0]+mi_wen[3]+mi_wen[6]==15:

print ( "条件4符合" )

flag = flag + 1

elif mi_wen[2]+mi_wen[4]+mi_wen[6]==15:

print ( "条件5符合" )

flag = flag + 1

elif mi_wen[0]+mi_wen[1]+mi_wen[2]==15:

print ( "条件6符合" )

flag = flag + 1

elif mi_wen[3]+mi_wen[4]+mi_wen[5]==15:

print ( "条件7符合" )

flag = flag + 1

elif mi_wen[6]+mi_wen[7]+mi_wen[8]==15:

print ( "条件8符合" )

flag = flag + 1


n=[]


for i in range(len(mi_wen)):

n.append(int(mi_wen[i]))

#print(n,end=" ")

#n.reverse()

for i in n:

print(min_wen[i-1],end= " " )

def huang_jiami(): #33

print ( '请输入明文' )

min_wen = list ( input ().split () ) # 明文

print ( '请输入密钥' )

mi_wen = list ( input ().split () ) # 密钥

# 判断是否是幻方

print ( '结果为' )

flag = 0

if mi_wen[0] + mi_wen[4] + mi_wen[8] == 15:

print ( "条件1符合" )

flag = flag + 1

elif mi_wen[1] + mi_wen[4] + mi_wen[7] == 15:

print ( "条件2符合" )

flag = flag + 1

elif mi_wen[2] + mi_wen[5] + mi_wen[8] == 15:

print ( "条件3符合" )

flag = flag + 1

elif mi_wen[0] + mi_wen[3] + mi_wen[6] == 15:

print ( "条件4符合" )

flag = flag + 1

elif mi_wen[2] + mi_wen[4] + mi_wen[6] == 15:

print ( "条件5符合" )

flag = flag + 1

elif mi_wen[0] + mi_wen[1] + mi_wen[2] == 15:

print ( "条件6符合" )

flag = flag + 1

elif mi_wen[3] + mi_wen[4] + mi_wen[5] == 15:

print ( "条件7符合" )

flag = flag + 1

elif mi_wen[6] + mi_wen[7] + mi_wen[8] == 15:

print ( "条件8符合" )

flag = flag + 1

if flag == 8:

print ( "为3阶的幻方密码" )

n = []


# 开始幻方加密

for i in range ( len ( mi_wen ) ):

n.append ( int ( mi_wen[i] ) )

# print(n,end="")

n.reverse()

for i in n:

print ( min_wen[i - 1] , end= " " ) # 其实还是输出明文那组数组


def nor_jiami():

# 加密

# 明文

print ( '请输入明文' )

min_wen = list ( input ().split () ) # 输入明文

n = [] # 用列表来装

# 密钥

print ( '请输入密钥' )

mi_yao = list ( input ().split () ) # 密钥 幻方

print ( '结果为' )

for i in range ( len ( mi_yao ) ):

n.append ( int ( mi_yao[i] ) )

# print(n,end="")

#n.reverse ()

for i in n:

print ( min_wen[i - 1] , end= " " ) # 其实还是输出明文那组数组

# 解密


# print('\n')


# for i in n:

# print(i)

def nor_jiemi():

# 4D 61 65 53 2D 4F 69 20 4E

# 8 1 6 3 5 7 4 9 2
# 1 2 3 4 5 6 7 8 9


# 解密
# 先输入密文 20 4D 4F 65 2D 69 53 4E 61
print( '请输入密文' )
mi_wen = list ( input ().split () )
# 输入密钥
n = []
print ( '请输入密钥' )
mi_yao = list ( input ().split () )
print( '结果为' )
for i in range ( len ( mi_yao ) ):
n.append ( int ( mi_yao[i] ) )
# print(n,end=" ")
n.reverse ()
for i in n:
print ( mi_wen[i - 1] , end= " " )

print( "1-置换解密 2-置换加密 3-幻方加密 4-幻方解密" )
print( "请输入选择" )
a=int(input())
if (a==1):
nor_jiemi ()
elif (a==2):
nor_jiami()
elif (a==3):
huang_jiami()
elif (a==4):
huang_jiemi()

运行结果如下

置换加密


置换解密



三阶幻方是最简单的 幻方 ,又叫九宫格,是由1,2,3,4,5,6,7,8,9九个 数字 组成的一个三行三列的矩阵(如右图示),其 对角线 、横行、竖列的 都为15,称这个最简单的幻方的幻和为15。中心数为5。所以我们只要加一个判断幻方的程序即可,然后进行运行输出

如图中代码所示



幻方加密

幻方解密

发布于 2022-08-26 23:04