密码学系列|Chapter 1 Exercises 1-10

admin 2022年1月12日10:17:07评论82 views字数 2918阅读9分43秒阅读模式

        下面是第一章练习题前十题的参考答案,部分是笔者自证,所以读者若是发现有纰漏之处,还望指正(可私信公众号)。

1.1

构建一个如1.1章节中所示的密码轮,且带有一个可旋转的内轮,并使用它完成以下任务

(a)顺时针旋转11圈,加密以下明文

“A page of history is worth a volume of logic.”

加密结果为:LALRPZQSTDEZCJTDHZCESLGZWFXPZQWZRTN

(b)解密以下消息,该消息使用7次旋转进行加密

AOLYLHYLUVZLJYLAZILAALYAOHUAOLZLJYLAZAOHALCLYFIVKFNBLZZLZ

解密结果为:There are no secrets better than the secrets that everybody guesses.

(c)解密以下消息,第一个字母顺时针旋转1,第二个字母顺时针旋转2,以此类推

XJHRFTNZHMZGAHIUETXZJNBWNUTRHEPOMDNBJMAUGORFAOIZOCC

解密结果为:When angry count ten before you speak if very angry an hundred

1.2

通过尝试各种可能的移位来解密以下凯撒加密,直到获得可读文本。

(a)LWKLQNWKDWLVKDOOQHYHUVHHDELOOERDUGORYHOBDVDWUHH

解密结果为:I think that I shall never see, a billboard lovely as a tree.

(b)UXENRBWXCUXENFQRLQJUCNABFQNWRCJUCNAJCRXWORWMB

解密结果为:Love is not love which alters when it alteration finds.

(c)BGUTBMBGZTFHNLXMKTIPBMAVAXXLXTEPTRLEXTOXKHHFYHKMAXFHNLX

解密结果为:In baiting a mousetrap with cheese, always leave room for the mouse.

solve.py

import string
def caesar(sk): 
   lower = string.ascii_lowercase  
   upper = string.ascii_uppercase  
   before = string.ascii_letters 
   after = lower[k:] + lower[:k+ upper[k:] + upper[:k]  
   table = ''.maketrans(beforeafter)   
   return s.translate(table

for k in range(1,27): 
   s = "LWKLQNWKDWLVKDOOQHYHUVHHDELOOERDUGORYHOBDVDWUHH"
   print(caesar(sk))
1.3

对于本练习,请使用如下给出的简单替换表

密码学系列|Chapter 1 Exercises 1-10

(a)加密如下的字符串

The gold is hidden in the garden.

加密结果为:IBXFE PAQLB QAAXW QWIBX FSVAX W

(b)制作一个解密表,也就是说,制作一个密文字母表,密文字母表的顺序是从a到Z,而明文字母表是混合的

密码学系列|Chapter 1 Exercises 1-10

(c)使用(b)中的解密表对以下消息进行解密。

IBXLX JVXIZ SLLDE VAQLL DEVAU QLB

解密结果为:The secret password is swordfish.

1.4

以下每条消息都已使用简单的替换密码进行加密,解密它们。为方便起见,我们为您提供了一个频率表和密文中出现的最常见的双字组列表。

密码学系列|Chapter 1 Exercises 1-10

参考答案


密码学系列|Chapter 1 Exercises 1-10

密码学系列|Chapter 1 Exercises 1-10


参考答案


密码学系列|Chapter 1 Exercises 1-10

密码学系列|Chapter 1 Exercises 1-10

参考答案


密码学系列|Chapter 1 Exercises 1-10

1.5

假设你有一个26个字母的字母表。

(a)有多少种可能的简单替换密码?

26! = 403291461126605635584000000

(b) 如果字母的加密是字母本身,那么字母表中的字母被称为固定的。剩下的简单替换密码有多少:

(i)没有固定的字母?

是一个错排问题,【对于的表达式,可以尝试求个 的极限看看】

(ii)至少固定一个字母?

错排的补集:

(iii)恰好固定了一个字母?

选择一个字母,剩下的错排,一共  种可能

(iv)至少固定两个字母?

固定两个字母是至少固定一个字母和恰好固定一个字母的差集:

1.6

,使用可整除性的定义直接证明可整除性的以下性质。

(a)如果 和 ,那么

根据如上条件设  ; 

那么 ,即成立

(b) 如果 和 ,那么

根据如上条件设   ; 

,那么  or 

即  成立

(c) 如果 和 ,那么 。

根据如上条件设   ; 

那么

即  和  成立

1.7

使用计算器和注1.9中描述的方法计算以下商和余数。

(a) 34787除以353.

(b) 238792除以7843.

(c) 9829387493除以873485.

(d) 149838748除以76348.

solve.py

a = [34787,238792,9829387493,149838748 ]
b = [353,7843,873485,76348]
for i in range(4):
   re = a[i]-b[i]*(a[i]//b[i])
   print(re)
   qu = a[i]//b[i]
   print(qu)
1.8

使用计算器和注1.9中描述的方法计算以下余数,无需计算相关商。

(a) 78745除以127的余数

(b) 2837647除以4387的余数

(c) 8739287463除以18754的余数

(d) 4536782793除以9784537的余数

solve.py

a = [78745,2837647,8739287463,4536782793 ]
b = [127,4387,18754,9784537]
for i in range(4):
   re = a[i]-b[i]*(a[i]//b[i])
   print(re)
1.9

使用欧几里德算法计算以下最大公约数。

(a) (291, 252).

(b) (16261, 85652).

(c) (139024789, 93278890).

(d) (16534528044, 8332745927).

solve.py

def gcd(ab):
   while b !0:
       ab = ba % b
   return a
print(gcd(291252),gcd(1626185652),gcd(13902478993278890),gcd(165345280448332745927))
1.10

利用练习1.9中的数据,使用扩展欧几里得定理计算出满足条件的u v

solve.py

def egcd(ab):
   if a == 0:
     return (b01)
   else:
     gyx = egcd(b % aa)
     return (g,x - (b // a* yy)

print(egcd(291252),egcd(1626185652),egcd(13902478993278890),egcd(165345280448332745927))

密码学系列|Chapter 1 Exercises 1-10

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月12日10:17:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   密码学系列|Chapter 1 Exercises 1-10http://cn-sec.com/archives/733815.html

发表评论

匿名网友 填写信息