下载链接

古典密码加解密设计实验

古典密码算法实验报告

姓名:空の城    学号:你猜  专业班级:网络安全专业

一、实验目的

通过编程实现替代密码算法——仿射密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。

二、实验原理

仿射密码的基本思想:加法密码和乘法密码结合就构成仿射密码,仿射密码的加密和解密算法是:

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的格式进行处理。

 


初闻不知曲中意,再听已是曲中人