深入浅出密码学
深入浅出密码学第一章题解
前言
仅记录下我的思路,如有错误,敬请指正。
由于现在我的时间不多,所以我可能会在未来的某个时间去查阅正确答案并修改这篇博客。
1.1
针对一个替换密码加密的密文,我们该如何破解呢?要知道,替换加密仅仅是将明文中的某字母用另外一个字母代替,这意味着但从字母出现的频率来看,明文和密文中字母出现的频率是一致的,尽管它们可能并不对应同一字母。
破解的方法就是利用统计分析的方法求得密文中各字母得出现频率,并将其和英文字母得出现频率作比较,在密文中国出现频率最高得字母极有可能对应英文字母中得 e,因为 e 是英文中出现最频繁得语言。
1.2
思路和上体是一样得,移位密码的密钥就是偏移量,当我们用频率统计的方法得出一个明文字母可能对应的密文字母后,可以算出偏移量 k1,如何验证偏移量是否正确呢?我们可以再得出另一个明文字母对应的密文字母,并计算出偏移量 k2,若 k1=k2,那么可以说明我们得到了正确的偏移量。若不等于的话更换我们的猜测。
1.3
1.3.1
现在我们有 100w 美元,每个集成电路花费 50 美元,这意味着我们可以购买 100w/50=20000 个集成电路,这就是我们可同时运行的集成电路数。
由于我们有20000个集成电路,而每个集成电路每秒可以检查 5* 10^8 个密钥,所以我们每秒总共可以检查 10000000000000 个密钥。当前 AES 的密钥长度为 128 位,这意味着共有 2^{128} 个可能的密钥,那么每个密钥搜索平均需要 34028236692093846346337460 秒,换算一下是 64741698424836085133 年。宇宙的年龄是 1 0 10 10^{10} 1010 年, 也就是说每个密钥搜索平均需要的时间比宇宙的年龄还要大。
1.3.2
若我们可在 24 小时内破解 AES 密钥,这意味我们每秒可以搜索的密钥量是
2
128
/
/
(
24
∗
60
∗
60
)
=
3938453320844195178974243141571391
2^{128}//(24*60*60) = 3938453320844195178974243141571391
2128//(24∗60∗60)=3938453320844195178974243141571391
现在我们的总成本没变,那么我们可同时运行的集成电路数就不变,也就是我们还拥有 20000 个集成电路,所以我们可以得出现在每个集成电路每秒可以搜索的密钥量是
3938453320844195178974243141571391
/
/
20000
=
196922666042209758948712157078
3938453320844195178974243141571391//20000 =196922666042209758948712157078
3938453320844195178974243141571391//20000=196922666042209758948712157078
集成电路原先每秒可以搜索的密钥是
5
∗
1
0
8
5*10^8
5∗108 ,这意味着我们速度提升了 393845332084419517897 倍,根据每18个月速度增加两倍,那么我们需要
393845332084419517897
/
/
18
=
21880296226912195438
393845332084419517897 //18=21880296226912195438
393845332084419517897//18=21880296226912195438 个月才可以到达这个速度,也就是需要 1823358018909349619 年才可以在不改变成本的情况下在24小时之内破解出 AES 的密钥。
1.4
1.4.1
输入的密码就是密钥,现在密码由8个字母组成,每个字母有128个可能性,也就是说我们的密钥空间有 12 8 8 128^8 1288
1.4.2
每个字母7位,一共输入8个字母,所以密钥的长度是56位。
1.4.3
依然是输入8个字母,但是每个字母的可能性变成了26种,所以密钥空间的大小为 2 6 8 26^8 268,但是密钥的长度依然是 56位
1.4.4
128//7 +1
1.5
不多细说,大于 13 的先约化
1.6
由于还没学习扩展欧几里得算法,这里的话可以穷举一下各个数模13、7 的逆元
1.7
前三题都很容易,按照书中对环的定义去做就好,比如乘法表就把行列数字相乘然后模上对应的数即可。
对于最后一题,书中已经说到,如果两个整数 a 和 m 是互素的,那么a 在模 m 下的逆元就是存在的,对于
Z
4
、
Z
6
Z_4、Z_6
Z4、Z6 ,和 4、6 不素数的有什么呢?
为什么
Z
5
Z_5
Z5 所有非零元素都有乘法逆元呢?因为 1-4 之间的所有数字都和 5 互素。
1.8
我们可以编写一个简单的 python脚本来看看这个问题的答案:
from Crypto.Util.number import GCD
a = 11
b = 12
c = 13
L = [a,b,c]
for i in L:
num = i
for j in range(1,num):
if(GCD(5,num) == 1 and (5*j)%num == 1):
print('5在模{}下的逆元为{}'.format(num,j))
能得到什么启发呢?对一个整数来说,若其模数变了,那么对应的逆元也变了。
1.9
1.4.1 节怎么做的呢?首先把指数拆分,进行部分的指数运算,然后把结果换成同一等价类中的其他元素。我们按照这个原则去计算x即可。
对于第五个问题,现在该如何去做?看起来我们只能枚举x看看能否在模13后得到11.
1.10
根据定义计算欧拉函数即可。不过定义中的n是大于等于0的,我觉得可以换成大于0,因为0 不会和除+_1以外的数互素。
1.11
还记得仿射密码的加密函数吗?
c
=
a
∗
m
+
b
c=a*m+b
c=a∗m+b 模 26
稍加推到可以得到
m
=
(
c
−
b
)
∗
a
−
1
m=(c-b)*a^{-1}
m=(c−b)∗a−1 模 26
已知a、b,按照以上公式求出m即可。
1.12
1.12.1
长见识啦,德文字母表居然由英文字母表额外加上4个字母,有意思!
由于现在共有30个字母,所以现在的模数就是 30
那么加密等式为:
c
≡
a
m
+
b
m
o
d
30
c\equiv\,am+b\,\mod\,30
c≡am+bmod30
解密等式和1.11一样,但是模数变为30
1.12.2
密钥空间的大小为 a的可能性乘以b的可能性。
a必须要满足和30互素,那现在的问题就是求30的欧拉函数值,经过计算发现是
1.13
我的思路是选择两个满足其差值和模数互素的x1和x2,这样就可以解出a来,之后再解出b。
1.14
第一章的最后一题又学到了东西,这个题目告诉我们多次仿射加密的安全性和单次仿射加密的安全性是一样的。