金融信息安全实训--古典密码学
“密码”用于“加密”数据。对于 原始的未加密的 数据,我们称之为“明文”。对于 加密的 结果,我们称之为“密文”。
古典密码算法历史上曾被广泛应用,使用手工和机械操作来实现加密和解密。它的主要应用对象是 文字信息 ,利用密码算法实现文字信息的加密和解密。
古典密码学的两种加密思路如下:
(1).替换密码
简单替换密码加密是通过将当前字母替换为在常规字母表中第n个位置之后的那个字母来完成的。较复杂的替换密码是为字母表建立映射关系,由此可以产生更大的密钥空间。
(2).换位密码
换位密码不对任何明文内容进行替换,而是通过换位(打乱顺序)的方法进行加密。典型的换位密码是双换位密码,这种加密方案首先要将明文写在一个给定大小的矩阵中,然后对行和列依据特定的序列进行置换操作。
古典密码学简单替换(凯撒密码)、简单换位(栅栏密码)加/解密程序举例:
-
①尝试凯撒密码25种可能的密钥破解密文“yvccfnficu”。
-
代码:
-
#include "stdio.h"
#include "conio.h"
int main()
{
int k,i=0;
char a[100],b[100]={0},c[100]={0};
printf("请输入密文(小写字母):\n");
gets(a);
for(k=1;k<=25;k++){
i=0;
do{
if((a[i]-k)<97)
b[i]=(char)(a[i]-k+26);
else
b[i]=(char)(a[i]-k);
i++;
}while(a[i]!='\0');
printf("解出明文为:\n");
puts(b);
}
return 0;
} -
运行结果:
-

②用栅栏密码恢复密文“hloodelwr”。
代码:
#include "stdio.h"
#include "conio.h"
int main()
{
char a[100],b[100]={0},c[100]={0};
printf("请输入明文(小写字母):\n");
gets(a);
int i=0,j=0,k=0;
do{
if(i%2==0){
b[j]=a[i];
j++;
}
else{
c[k]=a[i];
k++;
}
i++;
}while(a[i]!='\0'); //当遇到字符串结束符号时循环结束
i=0;
while(c[i]!='\0'){
b[j]=c[i];
i++;
j++;
}
printf("密文为:\n");
puts(b);//输出密文数组b
printf("请输入密文(小写字母):\n");
gets(a);
int len;
for(len=0;;len++) if(a[len]=='\0') break;
j=0;
if(len%2==0) k=len/2;
else k=len/2+1;
for(i=0;i<len;i++)
{
if(i%2==0){
b[i]=a[j];
j++;
}
else{
b[i]=a[k];
k++;
}
}
puts(b);
return 0;
}
运行结果:

特殊古典加密方法解密举例
1、"由人俱乙口一中"和"大中口由人由工"具有相同的含义。
*结果:
2、佛曰:諳摩呐若死漫哆蘇菩世梵智藝梵楞梵多梵夷冥數罰不一智提爍梵漫漫罰知冥槃僧奢心哆利皤切缽伊諳姪藝哆諦呐室智怯神怯瑟侄醯呐涅哆倒侄醯奢麼穆奢集般夢依侄神梵度亦三心滅楞逝諳無顛諳離諳。冥智恐死即者怯所不離。
结果: ILOVEYOU
3、
YmJhYWFhYmJiYWJhYmFhYWFhYWFiYWFhYmFhYmFhYWFiYmFiYWFhYmFhYmFhYWFhYWFiYWFiYg==
结果: YOUAREGREAT
