当前位置: 首页 > news >正文

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

免责声明

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

题目

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))

相关文章:

  • <进程间通信>共享内存
  • 知微传感3D相机上位机DkamViewer使用:设置相机的静态IP
  • 量子计算:商业化应用的未来蓝图
  • linux server docker 拉取镜像速度太慢或者超时的问题处理记录
  • 双指针刷题和总结
  • C# OnnxRuntime部署DAMO-YOLO香烟检测
  • 安全运维:从防火墙到入侵检测
  • 测试工程师Ai应用实战指南简例prompt
  • EX_25/3/3
  • 基于YALMIP和cplex工具箱的IEEE33微电网故障处理电网重构matlab模拟与仿真
  • 国产NAS系统飞牛云fnOS深度体验:从运维面板到博客生态全打通
  • 【新人系列】Golang 入门(二):基本数据类型
  • graido学习记录
  • 【图论】判断图中有环的两种方法及实现
  • vi的常见操作命令
  • [数据结构] - - - 链表
  • 面试题02.01.移除重复节点
  • 【计算机网络03】网络层协议IP(详细)
  • 苹果的 AI 紧急情况
  • KMP算法!
  • 未来之城湖州,正在书写怎样的城市未来
  • 印方称所有敌对行动均得到反击和回应,不会升级冲突
  • 工程院院士葛世荣获聘任为江西理工大学校长
  • 深圳两家会所涉卖淫嫖娼各被罚7万元逾期未缴,警方发催告书
  • 中国海警依法驱离日非法进入我钓鱼岛领海船只
  • “三德子”赵亮直播间卖“德子土鸡”,外包装商标实为“德子土”