信息系统安全实验(五):RSA加密算法在身份互认证中的应用(含c++代码)、国产加密算法SM4的基本知识

这是信息系统安全实验系列的第五篇~

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;
 
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值