2024年4月16日发(作者:)

第2章 古典密码体制

1.当k=5,b=3时,用仿射密码加密这些字符:WO SHI XUESHENG

解:加密公式:c=e(p)=5p+3(mod26)

首先转化把这些字母转换成数字:22,14,18,7,8,23,20,4,18,7,4,13,6

然后加密

22

3

9

G

14



21

V



3





18

3

15

P



3

12

M

7

3



R

8



17



23

3

14

O





5

20

3

(mod26)

25

(mod26)

Z

;



4

3

23

X

18

3

15

P









7

3

12

M

23

4

3



X





16

Q

13

3





7

6

3



H







所以,加密后为:GV PMR OZXPMXQH。

2.使用Vigenere方案,给出密文:

ZICVTWQNGRZGVTWAVZHCQYGLMGJ,找出对应下列明文的密钥:

Wearediscoveredsaveyourself 。

解:

明文:W e a r e d i s c o v e r e d s a v e y o u r s e l f

密文:ZIC VTWQNGR ZGVTWAVZH CQ YGLMGJ

将字幕转化成数字,再计算。

结果密钥为:3 4 2 4 15 19 8 21 4

3.分析Vigenere密码体制的安全性,并编程实现Vigenere密码算法。

解:Vigenere密码的强度在于对每个明文字母有多个密文字母对应,因此该字母的频率

信息是模糊的。实际上,维吉尼亚(Vigenere)密码是一种多表加密算法,在密文的不同位

置出现的字符通常不是以同样的方式加密的,但它是一种周期密码,如果两个同样的字符出

现的间隔固定,并且为密钥长度的倍数,则它们将以同样的方法进行加密。

Vigenere算法c语言的简单实现

#include

main()

{

int i,j,m,n,c,k,Ming_length,Key_length;

char vigenere_table[26][26];

char Key[200],Ming[500] ,Mi[200],s[26][26];

printf("Vigenere Table:n");

for(j=0;j<=25;j++)

{

printf("%cn",'a'+j);

for(i=0;i<=25;i++)

{

vigenere_table[i][j]='A'+(i+j)%26;

printf("%c",vigenere_table[i][j]);

}

}

printf("n");

for(i=0;i<=25;i++)

{

printf("%c",'a'+i);

}

printf("n");

printf("请输入明文:n");

gets(Ming);

printf("请输入密钥: n");

gets(Key);

Ming_length=strlen(Ming);

Key_length=strlen(Key);

printf("n");

k=0;

printf("明文是 n");

do

{

for(j=k;j

{

int m=Ming[j];

int n=Key[j-k];

printf("%c",vigenere_table[m-97][n-97]);

}

k+=Key_length;

}while(k

getch();

}

4.分析Hill密码体制的安全性,并编程实现Hill密码算法。

解:Hill密码技术可以较好地抗击统计分析攻击,但在面对已知明文的攻击就很容易被

破译,特别是在已知密钥矩阵行数的情况下。

算法实现:

#include

#include

#include

#define NUM 20