一、实验目的及要求
1. 掌握单表代替和多表代替密码体系
2. 从单表代替或多表代替密码中选取一个密码系统(除凯撒密码),编写程序实现该密码系统
二、实验设备(环境)及要求
PC机, VC++等
三、实验内容与步骤
1、加密(对代码中的主要内容进行分析讲解)
步骤:
- 根据密钥构造出字母代替表;
- 将要加密的字符串的每一个字符都减去‘a’,得它们在26个字母表的位置;
- 知道位置后,找出它们在字母代替表中的位置,将其替换成对应的密文。
2、解密
步骤:
- 将要解密的字符串的每个字符与字母代替表的每个字符一一对比,找出字符串字符在字母代替表的相对位置。
- 知道位置后,将字符替换为为26个字母表中相应位置的字母。
代码:
#include<stdio.h>
void encrypt(char keystring[],char word[]); //加密
void decode(char keystring[],char word[]); //解密
int main()
{
int i,j,temp;
int m,count = 0;
char key[20],keystring[26],word[100];
char c = 'a';
printf("请输入密钥key:");
scanf("%s",key);
for (i = 0; key[i] != '\0'; i++) //根据密钥,构造字母代替表
{
temp = 0;
for(j = 0; j != i; j++)
{
if(key[i] == key[j])
{
temp = 1;
break;
}
}
if(temp == 0)
{
keystring[count] = key[i];
count++;
}
}
m = count;
while(c <= 'z')
{
temp = 0;
for(i = 0; i < m; i++)
{
if(c == keystring[i])
{
temp = 1;
}
}
if(temp == 0)
{
keystring[count] = c;
count ++;
}
c++;
}
printf("请输入要加密或解密的字符串:");
scanf("%s",word);
printf("请输入您要使用的功能:\n1.加密\n2.解密\n你要:");
scanf("%d",&temp);
switch(temp)
{
case 1:
encrypt(keystring, word);
break;
case 2:
decode(keystring, word);
break;
}
return 0;
}
void encrypt(char keystring[],char word[]) //加密
{
int i,temp;
for(i =0; word[i] != '\0'; i++)
{
temp = word[i] - 'a';
word[i] = keystring[temp];
}
printf("%s", word);
}
void decode(char keystring[],char word[]) //解密
{
int i,j;
for(i =0; word[i] != '\0'; i++)
{
for(j = 0; j < 26; j++)
{
if(word[i] == keystring[j])
{
word[i] = 'a' + j;
break;
}
}
}
printf("%s", word);
}
四、实验结果与数据处理
密钥:spect 明文:asdfgh
- 加密
- 解密(有上题得到密文:sqcabd)
五、分析与讨论
通过这个实验,我明白了单表代替密码的原理以及步骤。单表代替密码最为重要的是通过密钥创建出字母字母代替表(注意:密钥出现重复字符要记得跳过),然后再以字母代替表为基础进行加解密。
不过单表代替密码存在一个致命的缺点:可以通过对密文中出现的各个字母进行统计,找出它们各自出现的频率,进行假设,从而推导出相应的密钥(旁路攻击)。
|