C++RSA非对称加密

非对称性加密简介

非对称加密,也称为公钥加密,是一种加密方式,相对于对称加密,它使用两个不同的密钥,一个公钥和一个私钥。公钥可以公开,任何人都可以使用它来加密消息,但只有私钥的持有者才能将其解密。

在非对称加密中,公钥和私钥是一对密钥,它们是由数学算法生成的。公钥可以被广泛分发,而私钥则必须保密。当A想要给B发送加密消息时,A使用B的公钥对消息进行加密,然后将密文发送给B。B收到密文后,使用自己的私钥进行解密,得到原始的消息。

非对称加密具有以下特点:

  • 安全性高:非对称加密使用不同的密钥进行加密和解密,相对于对称加密,更加安全,因为攻击者无法从公钥中推断出私钥。
  • 公钥分发方便:公钥是公开的,任何人都可以使用它来加密消息,因此公钥的分发相对来说更加方便。
  • 加密和解密速度慢:非对称加密的加密和解密速度相对于对称加密要慢得多,因为它需要进行更加复杂的数学计算。

目前,较为常见的非对称性加密算法有RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)Hash算法等等。

RSA算法简介

1、随机选择两个不相同的质数(素数)p和q

2、计算公共模数n=p*q

3、计算欧拉函数φ(n)=(p-1)(q-1)

4、计算随机整数公钥e,e要满足的条件有e大于一、小于欧拉函数φ(n)并和欧拉函数φ(n)互质。

5、计算模反元素密钥d,d要满足的条件是(d*e)%φ(n)=1

6、加密,密文数据c=明文数据m的e次幂再取余公共模数n,也就是c=(m^e)%n

7、解密,明文数据m=密文数据c的d次幂再取余公共模数n,也就是m=(c^d)%n

源码

AsymmetricEncryption.cpp

#ifndef ASYMMETRICENCRYPTION_CPP
#define ASYMMETRICENCRYPTION_CPP

#include "LargeNum.cpp"
#include <time.h>
#include <math.h>

//#define ASYMMETRICENCRYPTION_OUTPUT
	
	typedef struct RSA{
		LargeNum e ;
		LargeNum n ;
		LargeNum d ;
	} RSA ;
	
	//判断一个unsigned long long数是否是质数 
	bool is_prime(ull x){
		if(x < 2)return false ;
		if(x < 4)return true ;
		if((x % 6) != 1 && (x % 6) != 5)return false ;
		const ull last = sqrt(x) + 1 ;
		for(ull i = 2;i < last;++ i)
			if((x % i) == 0)return false ;
		return true ;
	}
	
	/*
	函数名称:GetKey
	函数参数:取随机质数的最大值、所加密的数据的最大值
	函数作用:返回一组RSA加密算法公钥、私钥组合结构体 
	*/
	RSA GetKey(ull max,ull min_num){
		srand(time(0)) ;
		RSA key ;
		LargeNum tn ;
		ull q,p ;
		while(tn <= min_num){
			q = 0ULL ;
			p = 0ULL ;
			while(!is_prime(q))q = rand() % max ;
			while(!is_prime(p) || q == p)p = rand() % max ;
			tn = (q - 1) * (p - 1) ;
		}
		key.n = q * p ;
		key.e = 2 ;
		while(gcd(key.e,tn) != 1)++ key.e ;
		key.d = 1 ;
		while(((key.e * key.d) % tn) != 1)++ key.d ;
		#ifdef ASYMMETRICENCRYPTION_OUTPUT
			printf("取随机素数:q:%llu p:%llu n:",q,p) ;
			key.n.output() ;
			printf(" 欧拉函数:") ;
			tn.output() ;
			printf(" e:") ;
			key.e.output() ;
			printf(" d:") ;
			key.d.output() ;
			printf("\n") ;
		#endif
		return move(key) ;
	}
	
	//加密 
	ll encryption(ull m,RSA& key){
		return (pow(LargeNum(m),key.e) % key.n).to_ll() ;
	}
	
	//解密 
	ll decrypt(ull c,RSA& key){
		return (pow(LargeNum(c),key.d) % key.n).to_ll() ;
	}
	
#endif

测试代码

#include <stdio.h>
#include "AsymmetricEncryption.cpp"
#include <string>
#include <iostream>
int main(){
	RSA key = GetKey(20,255) ;
	printf("原数据:") ;
	std::string t ;
	std::cin >> t ;
	ull data[t.size()] ;
	printf("加密后:") ;
	for(int i = 0;i < t.size();++ i)printf("%llu ",data[i] = encryption(t[i],key)) ;
	printf("\n") ;
	printf("解密后:") ;
	for(int i = 0;i < t.size();++ i)t[i] = decrypt(data[i],key) ;
	std::cout << t ;
	return 0 ;
}

其他

NUM_TYPE_def.cpp文件是我自己编写的大数乘法类,在我的首页置顶处,也在C++大整数类(上万位数秒算)-CSDN博客,编译时至于同一目录即可

开发环境:devc++
优化级别:自动
C++标准:ISOC++11

在头文件前定义宏ASYMMETRICENCRYPTION_OUTPUT,可以输出GetKey函数运行信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值