五邑大学本科生实验指导书
《密码学基础》实验指导书
课程名称:密码学基础
课程编号:
课程性质:专业选修课
课程总学时:48
实验总学时:8
任课教师:***
一、实验教学目的和基本要求   
密码学基础》是计算科学与技术本科专业开设的一门专业选修课,课程的主要目标是让学生学习和了解密码学的一些基本概念,理解和掌握一些常用密码算法,包括加密和解密、认证理论及算法、安全计算原理及算法,学会进行效率分析和安全性分析。密码学是信息全的核心技术,是实现安全通信的基础,所以实验和理论一样都很重要,实验能够让学生通过多个密码算法的程序设计实现,更好地掌握密码算法设计的机理和方法,熟悉网络攻击和防范方法。同时,基于密码系统设计的基本方法和基本步骤,帮助学生理解密码学在信息安全中的地位,并引导了解密码学领域及信息安全领域的新进展、新方向。具体要求如下:
1.要求学生在上机前本次实验的原理、内容、方案进行充分准备。
2.每次实验必须按要求的格式撰写《实验报告》,内容大体包括:实验目的、实验内容、实验及算法原理、程序清单、结果分析、总结。
3.实验成绩作为平时成绩的一部分。
二、实验内容及学时分配
实验一  古典密码学实验2学时)
一、实验目的
    通过实现简单的古典密码算法,理解密码学的相关概念如明文(plaintext)、密文(ciphertext)、加密密钥(encryption key)、解密密钥(decryption key)、加密算法(encryption algorithm)、解密算法(decryption algorithm)等。
二、实验内容
  1)用C\C++语言实现仿射变换(Affine)加/解密算法;2)用C\C++语言实现统计26个英文字母出现的频率的程序;3)利用仿射变换加/解密程序对一段较长的英文文章进行加密,再利用统计软件对明文和密文中字母出现的频率进行统计并作对比,观察有什么规律。
    放射变换:
加密
解密
其中a, b为密钥,,且gcd(a, 26)=1
实验要求:加/解密程序对任意满足条件的a、b都能够处理。
三、实验步骤
(1)统计26个英文字母出现的频率的程序
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
void main(){
    ifstream in("a.txt");
    vector<int> s;
    vector<int> 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<<"统计结果如下:"<<endl;
    for(int k=0;k<26;++k){
        // n[k]=n[k]/sum;
        cout<<' '<<char(k+97)<<"出现的概率为:"<<n[k]/sum<<endl;
        //cout<<n[k]<<endl;
    }
(2)仿射变换加/解密程序对一段较长的英文文章进行加密
#include <stdafx.h>
#include<iostream>
#include<fstream>
#include<vector>
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;
}//////////////////////////////////////////////////////////
void main(){
printf怎么加endl    cout<<"请你选择操作密码的方式:"<<endl<<"  0-表示加密 "<<endl<<"  1-表示解密 "<<endl;
    int z;
    cin>>z;
    if(z==0||z==1)       
    {
//////////////////////////////////////////
    cout<<"请输入密钥a和b:"<<endl;
    int a,b;
    cin>>a>>b;
    if((a<1||a>25)||(b<0||b>25))
        cout<<"a,b的输入范围有错!"<<endl;
    else
        if(gcd(a)==0)
            cout<<"密钥a有误,与26不互素"<<endl;
        else
        {
            if(z==0)////加密算法
            {
              ifstream in("a.txt");
              ofstream out("b.txt");
              vector<int> s;
              for(char x;in>>x; )
                    s.push_back(int(x));
              for(int i=0;i<s.size();++i)
              { 
                  s[i]=(a*(s[i]-97)+b)%26;
                  out<<char(s[i]+97);
              }
              cout<<endl;
              cout<<"加密成功!明文请见\"b.txt\""<<endl;
            }   
            else////解密算法
            {
                ifstream in("b.txt");
                ofstream out("a.txt");
                  vector<int> s;
                for(char x;in>>x; )
                    s.push_back(int(x));
                for(int i=0;i<s.size();++i)
                { 
                    s[i]=inv(a)*(s[i]-97-b+26)%26;
                    out<<char(s[i]+97);
                }out<<endl;cout<<"解密成功!密文请见\"a.txt\""<<endl;
            }
        }
////////////////////////////////////////
    }
    else
        cout<<"所选操作无效!"<<endl;
}
四、实验结果及分析
该程序是对文件进行操作,结果如下:
(1)统计26个英文字母出现的频率的程序
(2)仿射变换加/解密程序对一段较长的英文文章进行加密
下面是文本内容:
实验  AES密码的实现4学时)
一、实验目的
    通过实现AES密码算法,理解对称密码机制。
二、实验内容
    1)在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统;2)完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;3) 程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;4) 要求提供所设计系统的报告及完整的软件。
三、实验步骤
1.字节替换
SubBytes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。映射方法是把输入字节的高四位作为S盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。