一、實驗目的及要求
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)
五、分析與討論
通過這個實驗,我明白了單表代替密碼的原理以及步驟。單表代替密碼最爲重要的是通過密鑰創建出字母字母代替表(注意:密鑰出現重複字符要記得跳過),然後再以字母代替表爲基礎進行加解密。
不過單表代替密碼存在一個致命的缺點:可以通過對密文中出現的各個字母進行統計,找出它們各自出現的頻率,進行假設,從而推導出相應的密鑰(旁路攻擊)。
|