下面是第一章练习题前十题的参考答案,部分是笔者自证,所以读者若是发现有纰漏之处,还望指正(可私信公众号)。
构建一个如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
通过尝试各种可能的移位来解密以下凯撒加密,直到获得可读文本。
(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(s, k):
lower = string.ascii_lowercase
upper = string.ascii_uppercase
before = string.ascii_letters
after = lower[k:] + lower[:k] + upper[k:] + upper[:k]
table = ''.maketrans(before, after)
return s.translate(table)
for k in range(1,27):
s = "LWKLQNWKDWLVKDOOQHYHUVHHDELOOERDUGORYHOBDVDWUHH"
print(caesar(s, k))
对于本练习,请使用如下给出的简单替换表
(a)加密如下的字符串
The gold is hidden in the garden.
加密结果为:IBXFE PAQLB QAAXW QWIBX FSVAX W
(b)制作一个解密表,也就是说,制作一个密文字母表,密文字母表的顺序是从a到Z,而明文字母表是混合的
(c)使用(b)中的解密表对以下消息进行解密。
IBXLX JVXIZ SLLDE VAQLL DEVAU QLB
解密结果为:The secret password is swordfish.
以下每条消息都已使用简单的替换密码进行加密,解密它们。为方便起见,我们为您提供了一个频率表和密文中出现的最常见的双字组列表。
参考答案
参考答案
参考答案
假设你有一个26个字母的字母表。
(a)有多少种可能的简单替换密码?
26! = 403291461126605635584000000
(b) 如果字母的加密是字母本身,那么字母表中的字母被称为固定的。剩下的简单替换密码有多少:
(i)没有固定的字母?
是一个错排问题,【对于的表达式,可以尝试求个 的极限看看】
(ii)至少固定一个字母?
错排的补集:
(iii)恰好固定了一个字母?
选择一个字母,剩下的错排,一共 种可能
(iv)至少固定两个字母?
固定两个字母是至少固定一个字母和恰好固定一个字母的差集:
,使用可整除性的定义直接证明可整除性的以下性质。
(a)如果 和 ,那么。
根据如上条件设 ;
那么 ,即成立
(b) 如果 和 ,那么。
根据如上条件设 ;
,那么 , or
即 成立
(c) 如果 和 ,那么和 。
根据如上条件设 ;
那么,
即 和 成立
使用计算器和注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.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)
使用欧几里德算法计算以下最大公约数。
(a) (291, 252).
(b) (16261, 85652).
(c) (139024789, 93278890).
(d) (16534528044, 8332745927).
solve.py
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
print(gcd(291, 252),gcd(16261, 85652),gcd(139024789, 93278890),gcd(16534528044, 8332745927))
利用练习1.9中的数据,使用扩展欧几里得定理计算出满足条件的u v
solve.py
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g,x - (b // a) * y, y)
print(egcd(291, 252),egcd(16261, 85652),egcd(139024789, 93278890),egcd(16534528044, 8332745927))
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论