C++实现基础RSA加密算法

本文介绍了RSA非对称加密算法的基本概念,包括加密与解密过程,并提供了C++实现。通过线性筛法获取质数p和q,计算N、L、E和D,最终展示了一个使用199和211作为质数的例子,验证了加密和解密的正确性。
摘要由CSDN通过智能技术生成

一、基本概念

1.RSA加密算法为非对称加密方法,即加密与解密使用不同的密钥。

2.加密密钥PK(公开),解密密钥SK(私有)。

3.加密算法E与解密算法D都公开

4.具体数学证明参考:算法学习笔记(3) RSA原理与证明_HarmoniaLeo的博客-CSDN博客

二、RSA加密

Hide: 密文

Expose: 明文                        eq?Hide%20%3D%20Expose%5E%7BE%7D%20modN

( E , N ) : 加密密钥                       

 

三、RSA解密

Hide: 密文

Expose: 明文                        eq?Hide%20%3D%20Exprose%5E%7BD%7DmodN

( D , N ) : 解密密钥         

 

四、具体实现

(1)p , q : 两个质数,通过线性筛法获取

(2)N : N = p * q

(3)L:  eq?L%20%3D%20%5Cphi%20%28pq%29%3D%28p%20-%201%29*%28q%20-%201%29

(4)E:  eq?E%5Cepsilon%20%5Cleft%20%28%201%2CL%20%5Cright%20%29  且 E与L互质,

即gcd(E,L)==1

(5)D:eq?D%5Cepsilon%20%5Cleft%20%28%201%2CL%20%5Cright%20%29 且 E * D mod L = 1

 

1. 获取两个质数p,q(线性筛法)

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10000100;

//primes数组用来存放质数
int primes[N], cnt;
//st[i], i为质数则为false否则为true
bool st[N];

void get_primes(int n)
{
    for(int i = 2; i <= n; i++)
    {
        if(!st[i]) primes[cnt++] = i;
        for(int j = 0; primes[j] <= n / i; j ++)
        {
            st[primes[j]*i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}

int main()
{
    int n;
    cin >> n;
    get_primes(n);
    cout << primes[--cnt] << endl;
    return 0;
}

2. N的获取

N = p * q即可

 

3. L的计算

据公式L = (p-1)*(q-1)

 

4. E的计算

(这里 gcd函数写错了,把 y=x改成y=t,要是 x>y 也无伤大雅)

#include<iostream>

using namespace std;

typedef long long ll;

ll gcd(ll x,ll y)//x>y
{
	int t;
	if(x<y)
	{
		t=x;
		x=y;
		y=x;
	}
	return y==0 ? x : gcd(y , x%y);
}

int main()
{
	ll p,q,L={L的值}#;
	
	for(int E=2;E<=L;E++)
	{
		if(gcd(L,E)==1)cout<<E<<endl;
	}
	return 0;
}

 

5. D的计算

(这里gcd函数写错了,y=x改成y=t)

#include<iostream>

using namespace std;

typedef unsigned long long ll;

ll gcd(ll x,ll y)//x>y
{
	ll t;
	if(x<y)
	{
		t=x;
		x=y;
		y=x;
	}
	return y==0 ? x : gcd(y , x%y);
}

int main()
{
	ll p,q,L={L的值}#,E={E的值}#;
	
	for(ll D=2;D<=L;D++)
	{
		if((E%L)*(D%L)%L==1)cout<<D<<endl;
	}
	return 0;
}

五、例子

1. 当p = 199,q = 211时

2. L = (p - 1)*(q - 1) = 198 * 210 = 41580

3. N = p * q = 41989

4. 计算E:随机选取一个结果(例 E = 17)

9f1f85fa1ca242c58e9d47cf82d9d547.png

5.  当E = 17 ,L = 41580时 计算D,得出D = 22013

2417b2e7a23841388136127c7fad8bd4.png

 

6. 带入样例代码中测试

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

typedef unsigned long long ULL;

ULL N,L,E,D;

ULL RSAEnc(ULL num,ULL Z)//RSA加解密  num为数据 Z为指数项 
{
	
	ULL ans=1;
	ULL i=Z;
	while(i>0)
	{
		if(i&1)
		{
			ans=((ans%N)*(num%N))%N;
		}
		num=((num%N)*(num%N))%N;
		i=i>>1;
	}
	return ans%N;
}

int main()
{
	ULL num;
	N=41989;E=17;D=22013;
	
	cin>>num;
	
	num=RSAEnc(num,E);
	cout<<"加密后:"<<num<<endl;
	
	num=RSAEnc(num,D);
	cout<<"解密后:"<<num<<endl;
	
	return 0;
}

结果检验为正确

ad8e9757fc6143e98cd4816f60740f18.png

 本人是菜鸡,写这些主要是想记录一些自己的成长过程,如有写的不好的地方欢迎大佬指点指正!

参考:

RSA加密算法原理_张维鹏的博客-CSDN博客_rsa加密算法原理

算法学习笔记(3) RSA原理与证明_HarmoniaLeo的博客-CSDN博客

 

  • 15
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值