快速幂,蓝桥杯2019A组第五题RSA解密

本文介绍了RSA加密中的质因数分解和快速幂算法。首先通过质因数分解找到大数的两个质数因子p和q,然后利用(e*d)%(p-1)*(q-1)=1求解e。接着,使用快速幂算法计算C^e模n的结果,实现解密过程。示例中详细展示了如何运用这些算法解决具体问题。

互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数

在这里插入图片描述

思路:现在的要求是解密,所以按照公式,现在还差e,那么要求e就需要求p,q,根据公式(d*e)%(p-1)(q-1)=1可以知道p,q。

**注意,因为p,q是两个质数,所以他们的公因数只有1,所以n【n=p*q】只有这2个因子,没有别的因子了,所以就可以用暴力法,所以方法是:
循环i从2~根号n,若n%i==0,则证明i该i是p或q,n/i则是另一个数,就找到了p和q了!!
**

#include<iostream>
#include<cmath>
#define ll long long
//定义一个数据类型为long long
using namespace std;

int main()
{
	ll n=1001733993063167141;
	ll k=sqrt(n);
	for(ll i=2;i<k;i++)
	{
		if(n%i==0)
		{
			cout<<i<<' '<<n/i<<endl;
		}
	}
	return 0;
}

//891234941 1123984201[p和q的值]

n = 1001733993063167141
d = 212353
p=891234941
q=1123984201

//接下来求e,,这时候要用到真正的大数了。c++64long long不够用,虽然有_int128,但是有些编译器不支持。

  还是靠Python吧。下面代码打印出e=823816093931522017。注意e有很多个,取最小的一个就行了。
tmp = (p - 1) * (q - 1)
print(tmp)
for i in range(2,n+1):
    now = i * tmp + 1
    if (now % d == 0):
           print(now // d)   #打印e
           break             #有很多e,求第一个就行了

** 求= X = C^e mod n
这是快速幂的知识点:
e是C的指数
e&1:指的是取e的最后一位并判断是否为1,是否需要跳过
e>>=1:指的是把e的二进制右移一位,目的是把刚才判断过的最后一位除掉
已知:
(ab)%m=(a%m)(b%m)
通过转换,可得:
(ax)%m
=(a×a×a×…×a(共x个a相乘))%m
=(a%m)×(a×a×a×…×a(共x−1个a相乘))%m
=((a%m)×(a%m))×(a×a×a×…×a(共x−2个a相乘))%m

例如:
C^11% p=(C1*C2C8)%p=(C1%p)(C2%p)*(C8%p)
**

def qpow(c,e,n):
    ret = 1
    while e:
        if(e&1):
             ret = ret*c % n
        c = c*c % n
        e>>=1
    return ret
 
n = 1001733993063167141
e = 823816093931522017   #试试其他的e
C = 20190324
print(qpow(C,e,n))       #579706994112328949

在这里插入图片描述

下面是快速幂,和快速幂求模的模板

//快速幂求模
#include<iostream>
#define ll long long
using namespace std;

ll pow_mod(ll a,ll b,ll p)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
		{
			ans=ans*a%p;
		}
		a=a*a%p;
		b>>=1;
	}
	return ans;
}
int main()
{
	ll a,b,p;
	cin>>a>>b>>p;
	cout<<pow_mod(a,b,p)<<endl;;
	return 0;
} 


//快速幂:求a^b
#include<iostream>
#define ll long long
using namespace std;

ll pow_mod(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
		{
			ans=ans*a;
		}
		a=a*a;
		b>>=1;
	}
	return ans;
}
int main()
{
	ll a,b;
	cin>>a>>b;
	cout<<pow_mod(a,b)<<endl;;
	return 0;
} 


快速幂,求A^B最后三位数表示的整数

long long fastPower(long long base, long long power) 
{
long long result = 1;
while (power > 0)
{
if (power & 1)
{
result = result * base % 1000;
}
power >>= 1;
base = (base * base) % 1000;
}
return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值