主页 > 手机  > 

【密码学——基础理论与应用】李子臣编著第二章古典密码课后习题

【密码学——基础理论与应用】李子臣编著第二章古典密码课后习题
免责声明

这里都是自己搓或者手写的。 里面不少题目感觉有问题或者我的理解有偏颇,请大佬批评指正! 不带思考抄作业的请自动退出,我的并非全对,仅仅提供思维!

题目

2.1 def decrypt(m): s=[] for i in range(len(m)): if m[i]==' ': s.append(' ') else: s.append(chr(ord(m[i])-3)) str=''.join(s) return str m="RPQLD JDOOLD HVW GLYLVD LQ SDUWHV WUHV" print(decrypt(m)) 2.2 def column_permutation(s, columns, column_mapping): #####创建矩阵 rows = (len(s) + columns - 1) // columns # 计算行数 matrix = [['' for _ in range(columns)] for _ in range(rows)] # 创建矩阵 for i, char in enumerate(s): row = i // columns #行数等于位置除5 col = i % columns #列数等于位置对5取余 matrix[row][col] = char for col in range(columns): if matrix[rows-1][col] == '': matrix[rows-1][col] = ' ' # 使用 'X' 作为填充字符 #####进行列置换 num_rows = len(matrix) num_cols = len(matrix[0]) new_matrix = [row[:] for row in matrix] # 创建矩阵的副本 mapping = {} for i in range(len(column_mapping) - 1): mapping[column_mapping[i]] = column_mapping[i + 1] mapping[column_mapping[-1]] = column_mapping[0] # 最后一个列映射到第一个 for col in range(1, num_cols + 1): # 列索引从1开始 if col in mapping: target_col = mapping[col] for row in range(num_rows): new_matrix[row][target_col - 1] = matrix[row][col - 1] res = [] for j in range(num_cols): # 列索引 for i in range(num_rows): # 行索引 res.append(new_matrix[i][j]) return ''.join(res) plaintext="xiandaimimaxue" columns=5 column_mapping=[1,5,3] print(column_permutation(plaintext, columns, column_mapping)) 2.3 def encrypt(plaintext, key): newplaintext = plaintext.replace(" ", "") ciphertext = [] for i in range(len(newplaintext)): if newplaintext[i] != ' ': ciphertext.append(chr( (ord(newplaintext[i])-ord('a') + ord(key[i%7])-ord('a')) %26+ord('a'))) else: ciphertext.append(' ') return ''.join(ciphertext) plaintext="We are discovered save yourself" key="deceptive" print(encrypt(plaintext,key)) 2.4 a=[7,3,4,1,6,8,9,5,2] b=[4,1,2,7,9,8,5,6,3] m1="transpositionisare" m2="arrangementofthesy" def encrypt(a,b,m): s=[0]*18 for i in range(0,9): s[a[i]-1] = m[i] for i in range(0,9): s[b[i]+9-1] = m[i+9] str=''.join(s) return str print(encrypt(a,b,m1)) print(encrypt(a,b,m2)) 2.5

免责声明:感觉这题有点问题。 我们知道,明文通过加密变换变成密文 那么这题已知密文求解明文,应该要求x1-x4的逆变换,但是实际上解这题并不要求逆。

x1=[6,9,4,8,3,7,1,2,5] x2=[1,3,5,4,7,2,6,8,9] x3=[5,9,6,4,7,8,2,1,3] x4=[2,5,1,6,3,9,4,7,8] m1="pinsaotrs" m2="toinaisre" m3="negaemrar" m4="ttnhoyfes" m5="omlaofmbs" m6="esgaxsexx" def inv(a): b = [0] * 9 for i in range(0,9): b[a[i]-1]=i+1 return b def decrypt(a,m): s=[0]*9 for i in range(0,9): s[a[i]-1] = m[i] str=''.join(s) return str """ y1=inv(x1) y2=inv(x2) y3=inv(x3) y4=inv(x4) print(y1,y2,y3,y4) """ print(decrypt(x1,m1)+decrypt(x2,m2)+decrypt(x3,m3)+decrypt(x4,m4)+decrypt(x1,m5)+decrypt(x2,m6)) 2.6

2.7

对于模27 由于仿射密码的密钥满足0≤a,b<27,gcd(a,27)=1。 3 6 9 12 15 18 21 24这8个数均不满足a,而b不受限制。 因此,a有19个数,b有27个数,密钥对有19*27个。

对于模29 由于仿射密码的密钥满足0≤a,b<29,gcd(a,29)=1。 29是质数,因此a在范围内均成立,而b不受限制。 因此,a有29个数,b有29个数,密钥对有29*29个。

2.8 def encrypt(m): s=[] for i in range(len(m)): x=ord(m[i])-ord('A') y=(5*x+7)%26 c=chr(y+ord('A')) s.append(c) str=''.join(s) return str m="HELPME" print(encrypt(m)) 2.9 import gmpy2 def decrypt(a,c): s=[] for i in range(len(c)): x=(ord(c[i])-ord('A')-2+26)%26 y=(a*x)%26 m=chr(y+ord('A')) s.append(m) str=''.join(s) return str c="VMWZ" a=gmpy2.invert(11,26) print(decrypt(a,c)) 2.10 import gmpy2 def findkey(m,c): s=[] for i in range(len(c)): offset=(ord(c[i])-ord(m[i])+26)%26 key=chr(offset+ord('a')) s.append(key) str=''.join(s) return str m="nankaiuniversity" c="nrgkrbuebvvkszmy" print(findkey(m,c))

标签:

【密码学——基础理论与应用】李子臣编著第二章古典密码课后习题由讯客互联手机栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【密码学——基础理论与应用】李子臣编著第二章古典密码课后习题