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

一、基本概念

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
    评论
RSA是一种公钥加密算法,其实现步骤大致如下: 1. 选择两个大素数p和q,计算n=p*q,φ(n)=(p-1)*(q-1)。 2. 选择一个大于1且小于φ(n)的整数e,使得e与φ(n)互质。 3. 计算d,使得d*e ≡ 1(mod φ(n)),即d为e的模φ(n)的逆元。 4. 公钥为(n, e),私钥为(n, d)。 5. 加密时,对于明文m,计算密文c = m^e(mod n)。 6. 解密时,对于密文c,计算明文m = c^d(mod n)。 以下是一个简单的C++代码示例,实现RSA 1024加密算法: ``` #include <iostream> #include <cstdlib> #include <ctime> #include <cmath> #include <cstring> #include <fstream> using namespace std; typedef unsigned long long u64; // 随机生成一个1024位的素数 u64 getPrime() { u64 p = 0; while (true) { p = rand() % (1ull << 1024); if (p < (1ull << 1023)) continue; // 确保p有1024位 bool flag = true; for (u64 i = 2; i <= sqrt(p); i++) { if (p % i == 0) { flag = false; break; } } if (flag) return p; } } // 快速幂取模 u64 qpow(u64 a, u64 b, u64 mod) { u64 ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; a = (a * a) % mod; b >>= 1; } return ans; } // 扩展欧几里得算法求模φ(n)的逆元d u64 exgcd(u64 a, u64 b, u64 &x, u64 &y) { if (b == 0) { x = 1, y = 0; return a; } else { u64 d = exgcd(b, a % b, y, x); y -= (a / b) * x; return d; } } int main() { srand(time(NULL)); u64 p = getPrime(); // 随机生成素数p u64 q = getPrime(); // 随机生成素数q u64 n = p * q; // 计算n u64 phi = (p - 1) * (q - 1); // 计算phi(n) u64 e = 65537; // 选择e u64 d, x, y; exgcd(e, phi, d, x, y); // 求模phi(n)的逆元d d = (d % phi + phi) % phi; // 确保d为非负数 // 输出公钥和私钥 cout << "Public Key: (" << n << ", " << e << ")" << endl; cout << "Private Key: (" << n << ", " << d << ")" << endl; // 加密 u64 m = 123456789; u64 c = qpow(m, e, n); cout << "Encrypted Message: " << c << endl; // 解密 u64 m2 = qpow(c, d, n); cout << "Decrypted Message: " << m2 << endl; return 0; } ``` 需要注意的是,此代码只是一个简单的示例,针对大规模数据的应用需要更加复杂的实现方式。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值