古典密码算法实验报告
姓名:空の城 学号:你猜 专业班级:网络安全专业
一、实验目的
通过编程实现替代密码算法——仿射密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。
二、实验原理
仿射密码的基本思想:加法密码和乘法密码结合就构成仿射密码,仿射密码的加密和解密算法是:
C=Ek(m)=(k1m+k2)mod nC=Ek(m)=(k1m+k2)mod n
M=Dk(c)=k1(c-k2)mod nM=Dk(c)=k1(c-k2)mod n o仿射密码具有可逆性的条件是gcd(k,n)=1。当k1=1时,仿射密码变为加法密码,
当k2=0时,仿射密码变为乘法密码。o仿射密码中的密钥空间的大小为np(n),当n为26字母,p(n)=12,因此仿射密码的密钥空间为12×26=312。
三、实验内容
本实验以仿射密码算法为对象,利用C++语言实现利用仿射密码进行加密和解密的程序。
1)算法流程
将加密前的密文存入char类型的数组,char类型的数组ex存入加密后的值,a,b依次存放k1,k2,利用ascii码,依次处理数据进行加密,输出用+‘a’的ascii码后转换为字符即可,用递归的欧吉利函数求得a的逆元,用解密算法y[i] = (k1的逆元int(加密过的一个元素) –k1的逆元 k2) % 26;
2)程序代码(算法实现)
#include <iostream>
#include<math.h>
#include<string.h>
using namespace std;
//模的取逆 欧几里的递归实现
int dx, y, q;
void extend_Eulid(int aa, int bb)
{
if (bb == 0) {
dx = 1;y = 0;q = aa;
}
else {
extend_Eulid(bb, aa%bb);
int temp = dx;
dx = y;
y = temp - aa / bb*y;
}
}
int main()
{
int a, b, YN, i, l;
char c[100];
int x[100], y[100];
char ex[100];
first:
system("cls");
cout << "依次输入k =( a, b )的a, b值,需要满足gcd(a,26) = 1 " << endl;
cin >> a >> b;
cout << "加密函数为 ex = " << a << "*x + " << b << endl;
cout << endl <<"输入你要加密的明文" << endl;
cin >> c;//明文
l = strlen(c);//获取长度
//encode 依次处理
for (i = 0; i < l; i++)
{
//转化为数字
x[i] = c[i] - 'a';
ex[i] = (a * x[i] + b) % 26;
}
cout << "加密后的字母为:";
//转化为字符
for (i = 0; i < l; i++)
{
cout << char(ex[i] + 'a');
}
cout << endl;
//decode 解密
extend_Eulid(a, 26);//调用取逆
dx = (dx+26) % 26;
cout << "解密后的字母为:";
for (i = 0; i < l; i++)
{
y[i] = (dx*int(ex[i]) - dx*b) % 26;
y[i] = (y[i] + 26) % 26;//避免附属的出现
cout << char(y[i] + 'a');
}
cout<<endl;
system("pause");
cout<<"继续解密加密输入1 退出0" <<endl;
int pd=0;
cin>>pd;
if(pd==1)
goto first;
else
return 0;
}
四、运行结果
数据说明、运行结果说明、运行截图
a、输入文本:china is great 输入密钥k1、k2:5、3
加密输出结果为:NMRQDRPHKXDU
解密输出结果为:CHINA IS GREAT(大写)
b、输入文本 wanghaoxuan输入密钥k1=7 k2=3
输出:加密后的字母为:bdqtadxindq
解密后的字母为:wanghaoxuan
运行截图
五、实验总结
在解密函数最后的时候,忽略了在求y[i] = (k1的逆元int(加密过的一个元素) –k1的逆元 k2) % 26;的时候出现负数的情况,通过查阅资料用y[i] = (y[i] + 26) % 26;即可避免负数的出现。开始用C语言写但在字符的读入和处理空格的时候有很多的麻烦getchar等函数,所以最后使用的是c++ 的cin的格式进行处理。