实 验 报 告 实验课程名称 现 代 密 码 学 学 院 理学院 年级 0 8 专业班 03 学 生 姓 名 丁朋 学 号 2 5 开 课 时 间 2 0 1 0 至 2 0 1 1 学年第 二 学期 总 成 绩 教师签名 实验项目 名 称 实验一、古典密码(认识密码学) 成绩 一、实验目的 通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key )、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。 二、实验内容 1)用 C\C++语言实现仿射变换(Affine)加/解密算法;2)用 C\C++语言实现统计 26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。 放射变换: 加密: 26mod,bammEcba 解密: 26mod1,bcacDmba 其中 a, b 为密钥,25,0ba,且 gcd(a, 26)=1 实验要求:加/解密程序对任意满足条件的 a、b 都能够处理。 三、实验步骤 (1)统计 26 个英文字母出现的频率的程序 #include #include #include using namespace std; void main(){ ifstream in("a.txt"); vector s; vector n(26,0); for(int i=0;i<26;++i) s.push_back(97+i); for(char x;in>>x; ) for(int i=0;i<26;++i) if(int(x)==s[i]){ n[i]++;} float sum=0.0; for(int j=0;j<26;++j) sum+=n[j]; cout<<"统计结果如下:"< #include #include using namespace std; //////////判断两个数是不是互素(辗转相除)//////// bool gcd(int a){ int f=26,g,r; g=a; do{ r=f%g; f=g; g=r; } while(r); if(f==1) return 1; else return 0; } //////////////////求逆////// int inv(int a){ int x,i; for(i=1;i<=30;++i) if((26*i+1)%a==0) { x=(26*i+1)/a;break;} return x; } //////////////////////////////////////////////////...