这是信息系统安全实验系列的第五篇~
1. 实验目的
(1)掌握对称加密、非对称加密、身份认证的基本原理;
(2)实现凯撒密码加密算法、RSA加密算法以及他们的应用;
(3)了解国产加密算法SM4的基本知识。
2. 实验原理
(1)凯撒密码加密算法
凯撒密码是一种简单的替换密码,属于对称加密算法中的一种。密钥十分简单,选定一个mod 26的数作为密钥。加密时,将被加密的字母转换为数字(例如按字母顺序编号),然后将数字加上密钥在模26,便得到密文。解密时,将密文数字前移即可。
(2)RSA加密算法
RSA算法基于简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。步骤如下:
选择一对不同的、足够大的素数p,q。
计算n=pq。
计算f(n)=(p-1)(q-1),同时对p, q严加保密,不让任何人知道。
找一个与f(n)互质的数e,且1<e<f(n)。
计算d,使得de≡1 mod f(n)。这个公式也可以表达为d ≡e-1 mod f(n)
公钥KU=(e,n),私钥KR=(d,n)。
加密时,先将明文变换成0至n-1的一个整数M。若明文较长,可先分割成适当的组,然后再进行交换。设密文为C,则加密过程为。C=M^e (mod n)
解密过程为:M=C^d (mod n)
3. 实验过程记录
图1(加密通信过程)
(1)实现加密通信过程
① 代码(只支持传递仅含小写字母的消息)
#include<iostream>
#include<string>
#include<time.h>
#include<stdlib.h>
using namespace std;
//本程序只传输小写字母
const string message = "congratulations";//要传输的信息
const int length_k_sess = 8;//会话密钥的长度
const int half_length_key = 6;//双方的公钥和私钥的长度的一半(为简便,假设双方的密钥一样长)
int prime_num_1[20] = {17,23,31,41,47,59,67,73,83,97,103,109,127,137,149,157,163,173,181,193};//素数表(为简便,仅提供20个选择)
int prime_num_2[20] = {13,19,29,37,43,53,61,71,79,89,101,107,113,131,139,151,167,179,191,197};
class User{
public:
string name;//名字
int pub_key[2*half_length_key];//公钥
int pri_key[2*half_length_key];//私钥
string message_send;//发出的密文
string message_receive;//收到的密文
int k_sess[length_k_sess];//保存的会话密钥
string message;//信息明文
};
User Alice;
User Bob;
void generate_keys_rsa(User X){//生成X的公钥和私钥
cout << "Generating keys of " << X.name << " ..." << endl;
int suiji = (int)time(NULL);
for(int i = 0; i < half_length_key; i++){
srand(suiji);
int choice = (int)rand() % 20 + i * 77;
choice = choice % 20;