传统密码学算法
1、 替代密码
替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替
代后形成密文。例如:明文字母 a,b,c,d ,用 D,E,F,G 做对应替换后形成密文。
替代密码包括多种类型,如单表替代密码,多明码替代密码,多字母替代密码,多
表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环
移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第 k 个字
母替代。它的加密过程可以表示为下面的函数:
E(m)=(m+k) mod n
其中:m 为明文字母在字母表中的位置数;
n 为字母表中的字母个数;
k 为密钥;E(m)
为密文字母在字母表中对应的位置数。
例如,对于明文字母 H,其在字母表中的位置数为 8,设 k=4,则按照上式计算出
来的密文为 L:
E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L
2、 置换密码
置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而
实现明文信息的加密。置换密码有时又称为换位密码。
矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排
在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,
明文为 attack begins at five,密钥为 cipher,将明文按照每行 6 列的形式排在矩阵
中,形成如下形式:
a t t a c k
b e g i n s
a t f i v e
根据密钥 cipher 中各字母在字母表中出现的先后顺序,给定一个置换:
1 2 3 4 5 6
F= 1 4 5 3 2
6 1
根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第 3 列,第
2 列,第 6 列的顺序排列,则有下面形式: a a c t t k
b i n g e s
a i v f t e
从而得到密文:abatgftetcnvaiikse
其解密的过程是根据密钥的字母数作为列数,将密文按照列,行的顺序写出,再根
据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。
- 实验步骤
(1)根据实验原理部分对替代密码算法的介绍,自己创建明文信息,并选择一个密钥 k,
编写替代密码算法的实现程序,实现加密和解密操作。
(2)根据实验原理部分对置换密码算法的介绍,自己创建明文信息,并选择一个密钥,
编写置换密码算法的实现程序,实现加密和解密操作。
- 实验结果
1:L
2:abatgftetcnvaiikse
5、代码及运行截图
替代密码代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 500
int main() {
int i=0,k,m,n,l;
char str1[N],str2[N];
/*C=M+K...K is key...*/
printf("输入要加密的明文M\n");
gets(str1);/*输入要加密的明文M*/
printf("输入密钥K\n");
scanf("%d",&k);/*输入密钥K*/
m=strlen(str1);/*测试明文的长度*/
printf("明文的长度是%d\n",m);
printf("\n *\n *\n *\n***\n *\n");
printf("ciphertext(C) is ::\n\n");
for(i=0;i<m;i++)/*加密的过程*/{
n=(int)str1[i];/*将字符转换成ASCII*/
if(str1[i]==' ')/*如果字符串中出现空格返回空格*/{
printf(" ");
str2[i]=str1[i];
}
else if(n>96&&n<123)/*对小写进行加密*/{
n=(n-97+k)%26;
if(n<0)
n=26+n;
l=(char)(n+97);
printf("%c",l);
str2[i]=l;
}
else if(n>64&&n<91)/*对大写进行加密*/{
n=(n-65+k)%26;
if(n<0)
n=26+n;
l=(char)(n+97);
printf("%c",l);
str2[i]=l;
}
}
str2[i]='\0';
/*--------------------------------*/
printf("\n\nThe C length is %d",strlen(str2));
printf("\n\n *\n *\n *\n***\n *\n");
printf("When the ciphertext is '%s',\nThe password program is...::\n\n",str2);
m=strlen(str2);
for(i=0;i<m;i++)/*解密过程*/{
n=(int)str2[i];/*将字符转换成ASCII*/
if(str2[i]==' ')/*如果是空格,返回的也是空格*/{
printf(" ");
}
else if(n>96&&n<123)/*对小写进行解密*/{
n=(n-97-k)%26;
if(n<0)n=26+n;
l=(char)(n+97);
printf("%c",l);
}
else if(n>64&&n<91)/*对大写进行解密*/{
n=(n-65-k)%26;
if(n<0)
n=26+n;
l=(char)(n+97);
printf("%c",l);
}
}
str1[i]='\0';
return 0;
}
运行截图:
置换密码代码如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#define N 100
int main(){
/*----------------------------*/
int i,j,lenK,lenM,m,n,temp;
int T[N];
char K[N],M[N],C[N],Temp1[N],Temp2[N],Temp3[N];
/*----------------------------*/
printf("输入明文M\n");/*输入明文M*/
gets(M);
printf("输入密钥K\n");/*输入密钥K*/
gets(K);
lenK=strlen(K);
lenM=strlen(M);/*测设长度*/
m=lenM/lenK;
n=lenK;/*定义矩阵的长和宽*/
for(i=0;i<lenK;i++)/*对密钥进行数字排序*/{
temp=0;
for(j=0;j<lenK;j++){
if((int)K[i]<(int)K[j]){
temp+=1;
}
}
T[i]=lenK-temp;
printf("%d ",T[i]);/*输出各字符对应的数字顺序*/
}
/*--------------------------------*/
printf("\n\nFirst........\n\n");
for(i=0;i<m;i++)/*根据密钥将明文排列成矩阵*/{
for(j=0;j<n;j++){
Temp1[i*lenK+j]=M[i*lenK+j];
printf("%c?",Temp1[i*lenK+j]);
}
printf("\n");
}
Temp1[lenM]='\0';
/*--------------------------------*/
printf("\nSecond........\n\n");/*进行第一次置换*/
for(i=0;i<lenK;i++){
for(j=0;j<m;j++){
Temp2[j*lenK+i]=Temp1[j*lenK+T[i]-1];
}
}
Temp2[lenM]='\0';
for(i=0;i<m;i++){
for(j=0;j<lenK;j++){
printf("%c?",Temp2[i*lenK+j]);
}
printf("\n");
}
/*-------------------------------*/
printf("\nThird.......\n\n");/*进行第二次置换*/
for(i=0;i<lenK;i++){
for(j=0;j<m;j++){
Temp3[j*lenK+i]=Temp2[j*lenK+T[i]-1];
}
}
Temp3[lenM]='\0';
for(i=0;i<m;i++){
for(j=0;j<lenK;j++){
printf("%c ",Temp3[i*lenK+j]);
}
printf("\n");
}
/*-----------------------------*/
printf("输出结果\n");
for(j=0;j<lenK;j++){
for(i=0;i<m;i++){
printf("%c",Temp3[i*lenK+j]);
}
}
return 0;
}
运行截图:
- 心得体会:
(一)网络嗅探实验
在本次实验中,我通过使用 Sniffer Pro 网络分析器,深入学习了网络分析的相关知识,同时也掌握了使用 Sniffer Pro 进行网络分析的方法和技巧。在实验过程中,熟练掌握基本操作:在使用 Sniffer Pro 进行网络分析时,我们需要熟练掌握基本的操作,例如捕获数据包、分析数据包、过滤数据包、统计数据包等。只有掌握了这些基本操作,才能更加高效地进行网络分析。注意过滤条件的设置:在进行网络分析时,我们需要根据实际情况设置过滤条件,以便更快地找到所需的信息。但是,过滤条件的设置需要根据实际情况进行,过滤条件设置不当可能会漏掉重要信息。多角度分析数据包:在进行网络分析时,我们需要从多个角度对数据包进行分析,例如从协议、源地址、目的地址、数据包内容等多个方面进行分析。只有从多个角度进行分析,才能更全面地了解网络情况。结合实际问题进行分析:在进行网络分析时,我们需要结合实际问题进行分析,例如网络拥塞、延迟、丢包等问题。只有结合实际问题进行分析,才能更好地解决问题。总的来说,通过本次实验,我对网络分析有了更深入的了解,并且掌握了使用 Sniffer Pro 进行网络分析的方法和技巧。
- 传统密码学算法实验
通过本次实验,掌握了古典密码算法的基本原理,在本次实验中,我们学习了替代密码和置换密码两种古典密码算法,并进行了加密和解密的实验。了解到古典密码算法的基本原理和加密过程。凯撒密码是一种简单的替换密码,通过将明文中的每个字母按照一定的偏移量进行替换,得到密文。而置换密码则是将明文中的每个字母先进行一次线性变换,再进行一次替换,得到密文。这两种算法都有一定的安全性,但是随着计算机技术的发展,它们的安全性已经被攻击者所破解。
在实验中,我还加深了C语言的基本语法和编程技巧,掌握了C实现替代密码和置换密码的方法。通过编写代码,我深入理解了算法的实现过程和原理,同时也提高了自己的编程能力。
- 替代密码的原理是什么?
答:替代密码是一种密码加密方法,其原理是通过将明文中的字符替换成其他字符来生成密文。具体来说,替代密码通常会使用一个固定的替代规则,将明文中的每个字符替换成另一个字符,这个规则可以是一个固定的映射表或者是一个特定的算法。在解密时,只需按照相反的规则将密文中的字符还原成明文即可。替代密码包括凯撒密码和简单替代密码等,它们是最早的密码加密方法之一。
- 置换密码的原理是什么?
答:置换密码是一种简单的密码加密方法,其原理是通过对明文中的字符进行置换或替换来生成密文。具体来说,置换密码通常会将明文中的每个字符根据一个固定的规则替换成另一个字符,这个规则可以是一个固定的映射表或者是一个特定的算法。在解密时,只需按照相反的规则将密文中的字符还原成明文即可。置换密码虽然简单,但是在早期的密码学中曾经被广泛使用,例如凯撒密码和简单替换密码就是置换密码的典型代表。